我想在每个'标题'之后计算'text'的实例。我正在使用grep和awk但是对任何工具都开放。我的文件看起来像这样:
header1
text1
text2
text3
header2
text1
header3
header4
text1
text2
...
一个好的输出看起来像这样
header1 3
header2 2
header3 0
header4 2
...
我的问题类似于this,但不需要计算总出现次数,而是计算某个字符串之间的出现次数。
答案 0 :(得分:4)
此awk命令不会将整个文件存储在内存中:
awk '/^header/{if (head) print head,k;head=$1; k=0}!/^header/{k++}END{print head,k}' file
如果您只想计算包含text
的行,请将脚本更改为:
awk '/^header/{if (head) print head,k;head=$1; k=0}/text/{k++}END{print head,k}' file
答案 1 :(得分:2)
使用awk
:
$ awk '{if (/header/) {h=$0; a[h]=0} if (/text/) {a[h]++}} END{for (i in a) {print i" "a[i]}}' file
header1 3
header2 1
header3 0
header4 2
{if (/header/) {h=$0; a[h]=0} if (/text/) {a[h]++}}
使用每个“标题”行后每个“文本”行的匹配数填充数组a[]
。END{for (i in a) {print i" "a[i]}}
在读取文件后打印结果。