Linux shell脚本计算文本文件中char序列的出现?

时间:2009-10-30 21:57:03

标签: linux shell

我有一个大文本文件(超过70mb),需要计算文件中字符序列出现的次数。我可以找到很多脚本来完成这项工作,但是没有人会考虑到序列可以在不同的行上开始和结束。为了提高效率(我实际上有超过1个处理的文件),我无法预处理文件以删除换行符。

实施例: 如果我正在搜索“thisIsTheSequence”,则以下文件将有3个匹配项:

asdasdthisIsTheSequence
asdasdasthisIsT
heSequenceasdasdthisIsTheSequ
encesadasdasda

感谢您的帮助。

4 个答案:

答案 0 :(得分:7)

一个选项:

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

使用shell核心之外的实用程序可能有更高效的方法 - 特别是如果你可以将文件放在内存中。

答案 1 :(得分:2)

只需要一个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

答案 2 :(得分:0)

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

如果没有,一个解决方案是将你的序列分成两半并搜索一半(例如搜索“thisIsTh”和“eSequence”),然后回到你找到的事件并“仔细看看” “,即删除该区域的换行符并检查匹配。

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

答案 3 :(得分:-1)

使用类似的东西:

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

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