Shell 文件中计数的搜索、计数和位置

Shell 文件中计数的搜索、计数和位置,shell,awk,grep,pattern-matching,Shell,Awk,Grep,Pattern Matching,我不是Linux方面的专家,但在各种论坛上查看不同的帖子时,我一直在尝试编写一个脚本来匹配文件中同时出现的字符模式。 我的文件大约有2亿个字符(大写和小写),每行大约50个字符。我将所有的行合并在一起,使用 tr -d '\n' < input.txt > oneLineInput.txt 我试图寻找句子中出现的“tr”模式。我现在的剧本是 grep -o -i oneLineInput.txt -e tr | sort | uniq -c 上面的脚本对于一个小文件来说效果非常好

我不是Linux方面的专家,但在各种论坛上查看不同的帖子时,我一直在尝试编写一个脚本来匹配文件中同时出现的字符模式。 我的文件大约有2亿个字符(大写和小写),每行大约50个字符。我将所有的行合并在一起,使用

tr -d '\n' < input.txt > oneLineInput.txt
我试图寻找句子中出现的“tr”模式。我现在的剧本是

grep -o -i oneLineInput.txt -e tr | sort | uniq -c
上面的脚本对于一个小文件来说效果非常好,但是当我尝试在实际文件上运行它时,超过2亿个字符,完成任务需要很长时间(我失去了耐心,没有检查所花费的总时间)

  • 有没有办法优化代码 我也一直在努力争取比赛的位置。例如,在上面的示例文件中,“tr”从第4位和第27位开始

  • 是否可以将索引的位置作为输出中的一个数字

  • 谢谢

    awk
    将显示您在
    oneLineInput.txt中有多少
    tr

    awk -F"[Tt][Rr]" '{print NF-1}' oneLineInput.txt
    2
    

    要获得该职位:

    awk -F"[Tt][Rr]" 'BEGIN {print "hit\tposition"} {for (i=1;i<NF;i++) {p+=length($i);print ++a"\t"p+1+(a-1)*2}}' oneLineInput.txt
    hit     position
    1       4
    2       27
    

    awk-F“[Tt][Rr]”开始{print“hit\tposition”}{for(i=1;i以下是使用awk的另一种方法:

    { 
        while (match($0, /[Tt][Rr]/)) {
            ++n
            m += RSTART
            $0 = substr($0, RSTART + RLENGTH)
            printf "match %d: position %d\n", n, m + n - 1
        }
    }
    
    match
    将第一个匹配项的位置存储在变量
    RSTART
    中,而
    RLENGTH
    中的匹配项长度
    n
    将记录匹配项的数量。
    substr
    用于从字符串开头删除匹配项。要打印的位置必须偏移
    n-1

    输出:

    $ awk -f matches.awk file
    match 1: position 4
    match 2: position 27
    

    我可以使用上面的脚本计算“tr”在原始文件中的出现次数。但是,当“t”出现在一行的最后一个位置,而“r”是下一行的第一个字符时,我会错过一些计数。通过删除换行符,您创建了一种情况,即
    t
    在一行的末尾,而
    r
    在一行的开头现在,另一个字符将被视为
    tr
    的出现。这是您想要的吗?如果
    t
    r
    之间存在其他空格字符,那么它们是否应被视为
    tr
    呢?无论哪种方式,合并行都不是一个有用的步骤,如果这是所需的行为,则很容易忽略空格我拥有的文件没有任何空格。所讨论的模式也可以在两个连续的行上找到。因此,我合并了这些行。@Ed Morton,我如何忽略空格???有什么建议吗?使用
    -F'[Tt][[:space:]]*[Rr]'
    作为要匹配的FS,并使用
    -v RS='^$'
    作为GNU awk的记录分隔符(其他awk有其他方法).
    [[:space:][]*
    表示零个或多个空格字符,RS设置告诉gawk将整个文件视为单个字符串。哇……太棒了。工作完美无瑕。现在轮到我了解基本知识了:)太不可思议了。我真是太感谢你了。我必须破译并学习它是如何工作的。我以前使用的脚本对于我拥有的文件的大小来说需要很长时间。不幸的是,由于我的声誉,我无法提高投票率。非常感谢:)@biowizz不客气。学习所有好的技巧和窍门需要很多时间。谢谢。这对我来说非常有用o、 但是比前面的答案稍微慢一点。很高兴知道不同的方法来完成相同的任务。
    $ awk -f matches.awk file
    match 1: position 4
    match 2: position 27