如何在Unix中使用group by计数

5

我有以下记录列表

Item1,200
Item1,200
Item3,900
Item2,500
Item2,800
Item1,600
Item4,
Item5,
Item4,100
Item5,
Item5,444

我的输出应该是:
"Please check the file as Item1 is greater than 2"

我的awk命令输出结果包括空格(进行数数),但实际上不应该计算空格。

Item1 3
Item2 2
Item3 1
Item4 2
Item5 3

Unix命令应该计算上面列表中没有空格的项目,并且如果任何项目的计数大于2(不包括空格),则应返回一个声明“请检查记录”。 我尝试过以下awk命令,但无法过滤空白并获取计数大于2的记录。
awk -F, '{a[$1]++;}END{for (i in a)print i, a[i];}' filetest.txt 

1
在给定的输入下,您期望的输出是什么?请在问题中清楚地说明。 - Inian
我已经更新了问题! - Bobby
3个回答

2

您可以在命令前使用$2来检查第二个字段是否存在。同样,使用$3在一系列命令前面,以查看第三个字段是否存在,然后编写错误消息。

awk -F, '$3 {print "请检查记录:$_"}; $2 {a[$1]++;}END{for (i in a)print i, a[i];}' filetest.txt


谢谢!我应该检查任何项计数是否> 2(无空格),如果是,则应打印一个语句说明文件不正确,否则文件就是正确的。 - Bobby
1
你是指像这样吗?awk -F, '$2 {a[$1]++;}END{for (i in a){print i, a[i]}for (i in a){if(a[i]>2){print "请检查记录:", i, a[i]}}}' filetest.txt - Johannes Riecken
是的,谢谢!我还有一个类似但更加复杂的问题, 源代码: a,是的 a,是的 b,不 c,N/A c,N/A c,N/A如果“是的”和“不”都可以接受,如果不同的单词出现次数最多,则发送语句“请检查”。 - Bobby
正如另一个回答者所说,您需要编写另一个问题,并展示一些尝试解决问题的努力。awk有非常好的文档和大量的示例。 - Johannes Riecken

2

如果您需要按排序后的形式输出,请尝试以下内容。

awk -F, '$2{array[$1]++} END{for(k in array){print k,array[k] | "sort -k1"}}'  Input_file

输出将如下所示。
Item1 3
Item2 2
Item3 1
Item4 1
Item5 1

编辑:由于原帖作者要求提供第一和第二字段的计数,所以请尝试以下操作。

awk -F, '$2{array[$1]++;array2[$1" "$2]++;array3[$2]++} END{for(u in array){for(y in array3){if(array2[u" "y]){print u,array[u],y,array2[u" "y]}}}}'  

或者

awk -F, '$2{
  array[$1]++;
  array2[$1" "$2]++;
  array3[$2]++
  }
END{
  for(u in array){
    for(y in array3){
      if(array2[u" "y]){
        print u,array[u],y,array2[u" "y]
      }
    }
  }
}'  Input_file

输出如下。
Item1 3 200 2
Item1 3 600 1
Item2 2 500 1
Item2 2 800 1
Item3 1 900 1
Item4 1 100 1
Item5 1 444 1

EDI2: 根据OP的要求,现在添加一种解决方案。该方案将针对每个$1值省略任何重复的$2计数。

awk -F, '$2 && !array2[$1,$2]++{array[$1]++} END{for(k in array){print k,array[k] | "sort -k1"}}'   Input_file

输出将如下所示。
Item1 2
Item2 2
Item3 1
Item4 1
Item5 1

不对!我得到的输出是"Item1200,2"。 - Bobby
请在您的问题中更新使用的Input_file,并让我知道,因为我的代码仅用于显示Input_file示例。 - RavinderSingh13
抱歉,我的错!!我想要输出$1和$2的不同计数。 - Bobby
没问题,你能帮我看一下我修改的内容是否符合你的要求吗?如果可以的话,请在同一个地方告诉我。 - RavinderSingh13
我正在使用同样的方法,如果你查看Item1的输入文件,你会发现它总共有3行,但前两行的数据相同,都是200。现在我想忽略相同的数据,只取Item1的2个唯一数据。 - Bobby
显示剩余7条评论

0
在其中加入一个条件,检查空白字段($2!-“”)。
awk -F, '$2 != "" {a[$1]++;} END {for (i in a) { if (a[i] > 2) { print "Check the records for"i } } }' filetest.txt

结果:

Check the records for Item1

谢谢!我还有一个类似但是更加增强的问题,来源:a,是的;a,是的;b,不;c,N/A;c,N/A;c,N/A。这里“是的”和“不”是可以接受的。如果不同单词的数量最高,则发送一条消息:“请检查”。 - Bobby
请发布另一个问题,明确说明您需要什么。 - Raman Sailopal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接