3

我想在每个“标题”之后计算“文本”的实例。我正在使用 grep 和 awk 但对任何工具都开放。我的文件如下所示:

header1
text1
text2
text3
header2
text1
header3
header4
text1
text2
...

一个伟大的输出看起来像这样

header1 3
header2 2
header3 0
header4 2
...

我的问题与类似,但不需要计算总出现次数,而是计算某个字符串之间的出现次数。

4

2 回答 2

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
于 2013-08-14T10:17:27.227 回答
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]}}读取文件后打印结果。
于 2013-08-14T10:17:04.743 回答