【问题标题】:Counting lines after grep finds a stringgrep 找到字符串后计算行数
【发布时间】:2013-08-14 10:10:21
【问题描述】:

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

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

一个很好的输出应该是这样的

header1 3
header2 2
header3 0
header4 2
...

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

【问题讨论】:

  • grep 不能做到这一点,但 awk 是完美的。你试过什么?请发布一些代码。
  • 为什么header2下面只有text1时显示为2?

标签: bash shell awk grep


【解决方案1】:

此 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

【讨论】:

    【解决方案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]}} 读取文件后打印结果。

    【讨论】:

    • 如果文本中包含header怎么办?
    • 有可能。刚刚更新时考虑到了这一点。
    • 请检查问题:I'd like to count the instances of 'text' after each 'header'.
    • 嗯..让我们看看。 @psny?
    • @KarolyHorvath,如果 OP 没有在此答案中发表评论,他将无法收到通知。为什么“让我们看看?”他的问题很清楚。我的回答完成了,我认为没有必要投反对票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    相关资源
    最近更新 更多