【问题标题】:How to count lines with word after line where is word2 -bash如何在word2 -bash所在的行中逐行计算行数
【发布时间】:2015-03-23 10:50:06
【问题描述】:

我有一个大文本文件,其中一些行包含单词"DataMeetingIs11",而下一行包含单词"done"。我的任务是计算所有这些行。例如,我想计算以下内容:

......DataMeetingIs11.....
....done..................

但不是以下:

 ......DataMeetingIs11.....
 ..........................

我尝试使用下一个命令:

grep -A 1 DataMeetingIs11 file| grep -c done 

但它没有用。你能帮帮我吗?

编辑

如何计算没有“完成”字的行数?

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    您可以使用 awk 代替:

    awk '/DataMeetingIs11/ {a++; p=NR} /done/ && NR==(p+1) {c++} 
         END{print "Without done:", (a-c) ", With done:", c}' file
    Without done: 1, With done: 2
    

    说明:

    /DataMeetingIs11/    # when input line matches literal "DataMeetingIs11"
    {a++; p=NR}          # store current line # NR into variable p and increment a
    /done/ && NR==(p+1)  # when line matches "done" and when 
                         # current line # is p+1 (next line)
    {c++}                # increment a counter c
    END{print (a-c), c}  # print counts the end
    

    【讨论】:

    • 非常感谢,我还有一个问题如何计算没有“完成”字的行数,例如 grep -v in bash ?
    • 好的,请检查我更新的答案,以从同一命令中获取两个计数。我也可以知道您为什么删除了接受的标记吗?
    【解决方案2】:

    如果您知道(从您的数据结构中),“完成”这个词不会出现在 DataMeetingIs11 的同一行,这也应该有效(前提是您有 Gnu grep,因此 -A 标志是认可):

    fgrep -A 1 DataMeetingIs11 your_file|fgrep -c done
    

    【讨论】:

    • 谢谢,你能帮我解决 DataMeetingIs11 后面没有“done”行的问题吗 > fgrep -A 1 DataMeetingIs11 your_file|fgrep -v -c done ,没用
    • 我可以建议为此创建一个新线程吗?如果在不同的线程中处理不同的问题,事情会更容易讨论。
    • 处理“未完成”行最简单的方法是也计算数据会行的总数,“未完成”行数是总数减去“完成”行数' 行。或使用awk 或 Perl 或 Python,...
    【解决方案3】:

    另一种可能性是 Perl,它假设文件将作为一个整体放入内存中:

    perl -n -l -w -0777 -e 'print scalar(()=/DataMeetingIs11.*\n.*done/g)' your_file
    

    -0777 是“Perl Magic”,将整个文件作为单个字符串传递,而不是逐行处理。

    -n 负责将文件内容存储在 Perl 的“魔术变量”$_ 中

    Regexp 匹配您要查找的内容,修饰符 'g' 告诉 Perl 尽可能多地匹配它。

    '()=' 将正则表达式置于所谓的“列表模式”。列表模式下的正则表达式返回匹配列表。

    'scalar(...)' 运算符将列表中元素的数量转换为列表,然后将其打印到标准输出。

    -l 确保之后打印换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-08
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2017-12-29
      • 1970-01-01
      • 2020-06-30
      相关资源
      最近更新 更多