需要在solaris命令中重新排列和求和列

时间:2015-01-08 07:34:41

标签: awk solaris

我有以下数据名为atp.csv file

Date_Time,M_ID,N_ID,Status,Desc,AMount,Type
2015-01-05 00:00:00 076,1941321748,BD9010423590206,200,Transaction Successful,2000,PRETOP
2015-01-05 00:00:00 077,1941323504,BD9010423590207,351,Transaction Successful,5000,PRETOP
2015-01-05 00:00:00 078,1941321743,BD9010423590205,200,Transaction Successful,1500,PRETOP
2015-01-05 00:00:00 391,1941323498,BD9010500000003,200,Transaction Successful,1000,PRETOP

我想使用以下命令计算状态。

cat atp.csv|awk -F',' '{print $4}'|sort|uniq -c

输出如下:

3 200
1 351

但是我想要在下面输出,并且还希望在状态方面对数量列进行求和。

200,3,4500
351,1,5000

这是状态首先然后计算值。请帮助..

3 个答案:

答案 0 :(得分:5)

AWK具有关联数组。

% cat atp.csv | awk -F, 'NR>1 {n[$4]+=1;s[$4]+=$6;} END {for (k in n) { print k "," n[k] "," s[k]; }}' | sort
200,3,4500
351,1,5000

在上面:

  1. 使用NR>1跳过第一行(记录)。

  2. n[k]是密钥k的出现次数(因此我们添加1),而s[k]是字段6中的运行总和值(因此我们添加{{ 1}})。

  3. 最后,在处理完所有记录($6)之后,您可以按键(END)迭代关联的数组,并在数组for (k in n) { ... }中打印键和值与密钥相关联的n

答案 1 :(得分:1)

您也可以尝试此awk版本

awk -F',' '{print $4,",", a[$4]+=$6}' FileName  | sort -r  | uniq -cw 6 | sort -r

输出

  3 200 , 4500
  1 351 , 5000

另一种方式:

awk -F',' '{print $4,",", a[$4]+=$6}' FileName  | sort -r | uniq -cw 6 |sort -r |  sed 's/\([^ ]\+\).\([^ ]\+\).../\2,\1,/'

答案 2 :(得分:0)

全部(g)awk

awk -F, 'NR>1{a[$4]++;b[$4]+=$6}
         END{n=asorti(a,c);for(i=1;i<=n;i++)print c[i]","a[c[i]]","b[c[i]]}' file
相关问题