我想在每个“标题”之后计算“文本”的实例。我正在使用 grep 和 awk 但对任何工具都开放。我的文件如下所示:
header1
text1
text2
text3
header2
text1
header3
header4
text1
text2
...
一个伟大的输出看起来像这样
header1 3
header2 2
header3 0
header4 2
...
我的问题与此类似,但不需要计算总出现次数,而是计算某个字符串之间的出现次数。
此 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
与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]}}
读取文件后打印结果。