我有一个大文本文件,其中一些行包含单词"DataMeetingIs11"
,其中以下行包含单词"done"
。我的任务是计算所有这些线。例如,我想计算以下内容:
......DataMeetingIs11.....
....done..................
但不是以下内容:
......DataMeetingIs11.....
..........................
我尝试使用下一个命令:
grep -A 1 DataMeetingIs11 file| grep -c done
但它没有用。你能帮我吗?
编辑
如何在没有"完成"单词?
答案 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确保之后打印换行符。