如何用word一行一行计算行数,其中word2 -bash

时间:2015-03-22 09:56:18

标签: bash awk

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

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

但不是以下内容:

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

我尝试使用下一个命令:

grep -A 1 DataMeetingIs11 file| grep -c done 

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

编辑

如何在没有"完成"单词?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您(根据数据结构)知道“完成”这个词。不会出现在与DataMeetingIs11相同的行上,这也应该有效(假设您有Gnu grep,以便识别-A标志):

fgrep -A 1 DataMeetingIs11 your_file|fgrep -c done

答案 2 :(得分:0)

另一种可能性,即假定文件整体适合内存,将是Perl:

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

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

-n注意文件内容存储在Perl&#34;魔术变量&#34; $ _

Regexp符合您的要求,以及修饰符&#39; g&#39;告诉Perl尽可能多地匹配它。

&#39;()=&#39;将正则表达式置于所谓的&#34;列表模式&#34;。列表模式中的正则表达式返回匹配列表。

&#39;标量(...)&#39; operator将列表中的元素数量列表,然后打印到stdout。

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