用唯一计数和字符串来 grep 多行

用唯一计数和字符串来 grep 多行

样本.csv

DSN1,abc,FAILURE,12,24,45
DSN1,def,FAILURE,12,78,65
DSN1,abc,FAILURE,12,24,45
DSN1,abc,FAILURE,12,24,45
DSN1,abc,FAILURE,12,24,45
DSN1,def,FAILURE,12,78,65
DSN1,abc,FAILURE,12,24,45

我需要上述 sample.csv 中的失败次数,响应如下

abc 5
def 2

但是我没有在脚本中提到 abc/def。因为我已经给出了一个示例场景,在我的例子中,其中有很多像 abc 这样的字符串,所以我需要该字符串并计算失败次数。

请建议我

提前致谢

答案1

一个简单的解决方案是使用以下管道:

<Sample.csv grep '^[^,]*,[^,]*,FAILURE' | cut -d, -f2 | sort | uniq -c
  • grepFAILURE将提取第三列中的行
  • cut将提取列(分隔,符列号2
  • sort将对提取的列进行排序(相同的值将彼此相邻。)
  • uniq将删除重复的值,该-c选项将显示每个唯一值的计数

您还可以根据需要将其他过滤器插入管道。(例如grep在开始时)。

答案2

Ricky 的评论就是我会如何做,但如果您想要一个特定于 grep 的解决方案,您可以执行以下操作:

$ for i in {abc,def}; do echo -n "$i: "; grep -c $i input.txt; done;

这将输出预期的内容:

abc:5
def:2

更新

如果您不想在 for 循环中包含搜索键,我不知道如何仅使用 grep 来做到这一点。

但是您可以使用 awk 来完成。

awk 'BEGIN{FS=","}//{a[$2]++}END{for(x in a) print x,a[x]}' test.txt

解释:

FS="," -- 将记录分隔符设置为逗号

// -- 匹配所有行

我们创建一个名为“a”的关联数组

a[$2]++ -- 每一个匹配的模式我们取第二列并增加计数

END { .. }——完成所有匹配后运行此块。我们遍历所有元素打印键和计数。

答案3

请找到相同的:

awk < Sample.txt -F',' '{print $2}' | sort |uniq -c| grep "FAILURE"

谢谢你的回答:)

相关内容