Bash 在grep找到字符串后计算行数

Bash 在grep找到字符串后计算行数,bash,shell,awk,grep,Bash,Shell,Awk,Grep,我想在每个“标题”之后计算“文本”的实例。我正在使用grep和awk,但对任何工具都持开放态度。我的文件如下所示: header1 text1 text2 text3 header2 text1 header3 header4 text1 text2 ... 一个好的输出应该是这样的 header1 3 header2 2 header3 0 header4 2 ... 我的问题与类似,但要求不计算总出现次数,而是计算某个字符串之间的出现次数。Withawk: $ awk '{if (/h

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

header1
text1
text2
text3
header2
text1
header3
header4
text1
text2
...
一个好的输出应该是这样的

header1 3
header2 2
header3 0
header4 2
...
我的问题与类似,但要求不计算总出现次数,而是计算某个字符串之间的出现次数。

With
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]++}
    用每个“header”行之后的每个“text”行的匹配数填充数组
    a[]
  • END{for(i in a){print i”“a[i]}}
    读取文件后打印结果

此awk命令不会将整个文件存储在内存中:

awk '/^header/{if (head) print head,k;head=$1; k=0}!/^header/{k++}END{print head,k}' file
如果您只对包含
文本的行数感兴趣,请将脚本更改为:

awk '/^header/{if (head) print head,k;head=$1; k=0}/text/{k++}END{print head,k}' file

grep无法做到这一点,但awk是完美的。你试过什么?请发布一些代码。为什么
标题2
下面只有
文本1
时显示2?那么如果文本包含
标题
,该怎么办?这是可能的。刚刚更新时考虑到了这一点。请检查问题:
我想在每个“header”之后计算“text”的实例数。
.Hmm。。让我看看@psny?@KarolyHorvath,如果OP没有在回答中发表评论,他将无法收到通知。为什么要“让我看看?”他的问题很清楚。我的回答完成了,我认为没有必要投反对票。