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

Awk 需要在solaris命令中重新排列和求和列,awk,solaris,Awk,Solaris,我有以下名为atp.csv文件的数据 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

我有以下名为atp.csv文件的数据

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
但我想喜欢下面的输出,还想在状态方面对amount列求和

200,3,4500
351,1,5000

即状态是第一个,然后是计数值。请帮助。

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
在上述情况下:

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

  • n[k]
    是键
    k
    的出现次数(因此我们添加1),
    s[k]
    是字段6中的运行总和值(因此我们添加
    $6

  • 最后,在处理完所有记录后(
    END
    ),您可以按键(
    for(k in n){…}
    )在关联数组中迭代,并打印与键关联的数组
    n
    s
    中的键和值


  • 您也可以尝试此
    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,/'
    
    另一种方式:

      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,/'
    
    全包(g)awk

    awk-F,'NR>1{a[$4]+;b[$4]+=$6}
    
    END{n=asorti(a,c);用于(i=1;i
    uniq-w 1
    仅比较第一个字符,如果
    $4
    中包含的其中一个输入行(例如201)将失败。请参阅我的更新答案,
    -w 6
    匹配到
    6
    字符,因此唯一状态id仅打印。您尝试过吗?这包括第二列中的字符,不再回答这是操作问题。除非uniq获得了更好的字段概念(目前正在研究中),否则我认为它不容易在这里应用。uniq:非法选项-w用法:uniq[-c |-d |-u][f fields][s char][input_file[output_file]]或:uniq[-c |-d |-u][n][m][input_file[output_file]]很好,+1。稍微修改一下:awk-F,'NR>1{n[$4]++;s[$4]+=$6;}END{for(k in n){print k,n[k],s[k];}}'OFS=“,”atp.csv |或者你不需要在块的末尾使用分号或
    {
    print语句末尾的方括号。P.s不将
    cat
    导入
    awk
    ,它将文件作为参数。感谢您的评论。是的,它可以减少字符数。关于使用cat的注意事项:运行时速度较慢,但就我个人而言,我喜欢使用“cat…”模式,因为我经常想在其他地方采用链的一部分,如果我意外地运行了“cat atp-2015.csv | awk”…“atp-2014.csv”:-)如果您使用的是Solaris,为什么要将问题标记为Linux?Solaris上没有安装gawk(默认情况下)