如何通过unix中的计数获取组

时间:2017-08-14 08:51:58

标签: bash shell unix awk

我有以下记录列表

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 

3 个答案:

答案 0 :(得分:2)

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

awk -F, '$3 {print "Please check the records: $_"}; $2 {a[$1]++;}END{for (i in a)print i, a[i];}' filetest.txt

答案 1 :(得分:1)

尝试关注一次,考虑到您需要以排序形式输出。

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

编辑:由于OP要求提供第一个和第二个字段的计数,请您试试。

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美元的价值,OMMIT的任何重复计数为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

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