Bash 使用Grep(或任何其他命令行工具)计算包含不同模式的行数

Bash 使用Grep(或任何其他命令行工具)计算包含不同模式的行数,bash,shell,grep,Bash,Shell,Grep,我正在试验OpenMP,我只是想写一个小的shell脚本来计算每个线程输出的行数。然后简单地说出每一个数字。 我开始使用它,开始编写一个带有硬编码或参数化上限的for循环,grep-c REG_EX,我还尝试使用sed首先清理额外的输出,以使greps工作更容易,但它并没有像我希望的那样工作 EXAMPLE PROGRAM OUT(SCRIPT INPUT) Output to STDOUT (I can obviously pipe into sort first): Thread 0: E

我正在试验OpenMP,我只是想写一个小的shell脚本来计算每个线程输出的行数。然后简单地说出每一个数字。 我开始使用它,开始编写一个带有硬编码或参数化上限的for循环,grep-c REG_EX,我还尝试使用sed首先清理额外的输出,以使greps工作更容易,但它并没有像我希望的那样工作

EXAMPLE PROGRAM OUT(SCRIPT INPUT)

Output to STDOUT (I can obviously pipe into sort first):
Thread 0: EXTRA OUTPUT
Thread 0: EXTRA OUTPUT
Thread 2: EXTRA OUTPUT
Thread 3: EXTRA OUTPUT
Thread 0: EXTRA OUTPUT
Thread 1: EXTRA OUTPUT
.
.
.

我只需要:

Thread 0: #repeats
Thread 1: #repeats
.
.
.
Thread n: #repeats

提前感谢

要获得与模式不匹配的线条,请使用

grep-v“模式”文件

要想得到那些有用的线路

grep“模式”文件

算了,

grep-v'foo'bar.txt | wc-l
(#与'foo'不匹配的行)

grep'foo'bar.txt | wc-l
(#与'foo'匹配的行)


这似乎是标题所要求的,但我必须承认,你的帖子把我弄糊涂了

你可以将grep的输出传输到wc(“字数”),wc带有-l标志,将计算行数:

grep needle haystack.txt | wc -l

只需将输出导入以下内容:

grep -o "Thread [0-9]*" | sort | uniq -c | awk '{print $2, $3 ":", $1}'

这将首先将每一行减少到冒号之前的部分(以便给定线程输出的每一行都是相同的),计算每个线程输出的行数,并重新排列uniq的输出以匹配您的示例输出。

我认为仅凭
awk
就足够了。这适用于任何数量的线程

awk -F ":| " '{a[$2]++; if($2>max) max=$2;} END {for (i=0; i<=max; i++) print "Thread "i": "a[i]}' output
您只需要awk:

<infile awk '{ h[$1" "$2]++ } END { for(k in h) print k, h[k] }'

如果您只想计算以“Thread”开头的行数,请在第一个块前面加上这样的前缀:
$1==“Thread”{h[$1”“$2]+}…

@perreal-对不起,我不明白。对不起,您不需要catmeant@perreal-哦,是的,实际上,我通过制作一个名为
output
的文件对其进行了测试。感谢您回答了我遇到的一个隐含问题,即仅仅尝试获取线程[0-9]*:部分,我不知道为什么这对我不起作用。@MichaelSweatt-如果它解决了您的问题,您应该接受答案。很抱歉延迟,我还有150万件事要做,现在我又回到这个话题上来了。在我接受它之前,我想确认一下。很抱歉,我问的是如何计算以不同模式开头的行数
grep-c
具有相同的效果。
Thread 0: 3
Thread 1: 1
Thread 2: 1
Thread 3: 1
<infile awk '{ h[$1" "$2]++ } END { for(k in h) print k, h[k] }'
Thread 0: 3
Thread 1: 1
Thread 2: 1
Thread 3: 1