Linux shell脚本来计算文本文件中字符序列的发生?

我有一个大的文本文件(超过70MB),需要统计文件中出现字符序列的次数。 我可以find很多的脚本来做到这一点,但是他们并没有考虑到一个序列可以在不同的行上开始和结束。 为了效率(我实际上有超过1个文件我正在处理),我不能预处理文件,以删除换行符。

示例:如果我正在search“thisIsTheSequence”,则以下文件将具有3个匹配项:

asdasdthisIsTheSequence asdasdasthisIsT heSequenceasdasdthisIsTheSequ encesadasdasda 

谢谢您的帮助。

只需要一个awk脚本就可以了,因为你将会处理一个巨大的文件。 做多个管道可能会减慢速度。

 #!/bin/bash awk 'BEGIN{ search="thisIsTheSequence" total=0 } NR%10==0{ c=gsub(search,"",s) total+=c } NR{ s=s $0 } END{ c=gsub(search,"",s) print "total count: "total+c }' file 

产量

 $ more file asdasdthisIsTheSequence asdasdasthisIsT heSequenceasdasdthisIsTheSequ encesadasdasdaasdasdthisIsTheSequence asdasdasthisIsT heSequenceasdasdthisIsTheSequ encesadasdasda asdasdthisIsTheSequence asdasdasthisIsT heSequenceasdasdthisIsTheSequ encesadasdasda $ ./shell.sh total count: 9 

一个选项:

 echo $((`tr -d "\n" < file | sed 's/thisIsTheSequence/\n/g' | wc -l` - 1)) 

有可能更有效的方法使用外壳的核心之外的工具 – 特别是如果你可以适应内存中的文件。

你的序列中是否会有多于一个换行符?

如果不是的话,一个解决办法是把你的序列分成两半,搜索一半(例如搜索“thisIsTh”,也搜索“eSequence”),然后返回到你发现的事件并进行“仔细观察”剥离该地区的换行符并检查比赛。

基本上这是一种快速的“过滤”数据,以找到有趣的东西。

使用类似于:

 head -n LL filename | tail -n YY | grep text | wc -l 

其中LL是序列的最后一行,YY是序列中的行数(即LL – 第一行)