Shell 文件中计数的搜索、计数和位置
我不是Linux方面的专家,但在各种论坛上查看不同的帖子时,我一直在尝试编写一个脚本来匹配文件中同时出现的字符模式。 我的文件大约有2亿个字符(大写和小写),每行大约50个字符。我将所有的行合并在一起,使用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 上面的脚本对于一个小文件来说效果非常好
tr -d '\n' < input.txt > oneLineInput.txt
我试图寻找句子中出现的“tr”模式。我现在的剧本是
grep -o -i oneLineInput.txt -e tr | sort | uniq -c
上面的脚本对于一个小文件来说效果非常好,但是当我尝试在实际文件上运行它时,超过2亿个字符,完成任务需要很长时间(我失去了耐心,没有检查所花费的总时间)
谢谢此
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