Awk 对于第一列中出现的每个字段,求第二列中所有对应字段的总和

Awk 对于第一列中出现的每个字段,求第二列中所有对应字段的总和,awk,Awk,我的输出有两列,我需要一个awk-linux命令来为第一列中出现的每个字段求第二列的所有对应字段的和。然后打印第1列的唯一值及其在第to列中对应的和。尝试在结果上遵循awk $ bpimagelist -l -d 11/01/2013 03:27:13 -e 11/01/2013 03:30:00 | awk '/^IMAGE/ {print $2, $19}' XXclcnpde148-bak.XX 11808 XXclnXXcXXcde010-bak.XX 26400 XXcwcnpd

我的输出有两列,我需要一个awk-linux命令来为第一列中出现的每个字段求第二列的所有对应字段的和。然后打印第1列的唯一值及其在第to列中对应的和。

尝试在结果上遵循
awk

$ bpimagelist -l -d 11/01/2013 03:27:13 -e 11/01/2013 03:30:00 | awk '/^IMAGE/ {print $2, $19}'

XXclcnpde148-bak.XX 11808

XXclnXXcXXcde010-bak.XX 26400

XXcwcnpde148-bak.XX 1623072

XXcwcnpde207-bak.XX 672

XXcwcnpde207-bak.XX 672

XXcwcnpde209-bak.XX 672

XXcwcnpde209-bak.XX 672

XXcwcnpde209-bak.XX 672

-
-
-
- and continues
输出:

awk '{a[$1]+=$2} END {for (x in a) print x, a[x]}' file

事实上,您可以在单个awk中完成相同的任务,如下所示

XXclnXXcXXcde010-bak.XX 26400
XXcwcnpde207-bak.XX 1344
XXcwcnpde148-bak.XX 1623072
XXclcnpde148-bak.XX 11808
XXcwcnpde209-bak.XX 2016

编辑(根据OP的评论)

如何获得排序后的输出。使用相应的值对列n 1进行排序 第2栏和还可以使用列的相应值对列n2进行排序 一,

最简单的方法是使用
sort

  • 第1列排序

    awk'{a[$1]+=$2}END{for(a中的x)print x,a[x]}'文件| sort-k1

    -k1
    是可选的,因为它是默认行为

  • 第2列排序

    awk'{a[$1]+=$2}END{for(a中的x)print x,a[x]}'文件| sort-n-k2

    -n
    用于数字排序,因为第二个字段由数字组成


对于第2列和第1列作为id的总和:

bpimagelist ... | awk '/^IMAGE/ {a[$2]+=$19} END {for (x in a) print x, a[x]}'
awk'{sum2[$1]+=$2};结束{for(sum2中的id){print id,sum2[id]}}{input

这里$1是id字段,$2是第2列。我们为求和列2构建了1个数组。处理完所有行/记录后,我们迭代数组键(id字符串),并打印该数组索引处的值。

在Gnu Awk版本4中,您可以使用
PROCINFO[“sorted_In”]
对结果进行排序。例如:

awk '{sum2[$1] += $2}; END{ for (id in sum2) { print id, sum2[id] } }' < input
其中
a.awk
为:

gawk -f a.awk file
给出输出:

{ a[$1]+=$2 }

END {
    print "Sorted on string value of first column:"
    print "---------------------------------------"
    PROCINFO["sorted_in"] = "@ind_str_asc" 
    for (i in a) {
        print i, a[i]
    }
    print ""
    print "Sorted on numerical value of second column:"
    print "-------------------------------------------"
    PROCINFO["sorted_in"] = "@val_num_asc" 
    for (i in a) {
        print i, a[i]
    }
}

谢谢,下面的命令运行良好,awk'{a[$1]+=$2}END{for(a中的x)print x,a[x]}'文件请告诉我如何获得排序输出。使用列2的相应值对列1进行排序还可以使用第1列的相应值对第2列进行排序。@user3016638请检查我答案中的编辑。谢谢,下面的命令运行良好,awk'{a[$1]+=$2}END{对于(a中的x)打印x,[x]}文件,请告诉我如何获得排序后的输出。使用列2的相应值对列1进行排序还可以使用第1列的相应值对第2列进行排序请注意,
awk'{commands}'文件
已经足够了,您不需要
Sorted on string value of first column:
---------------------------------------
XXclcnpde148-bak.XX 11808
XXclnXXcXXcde010-bak.XX 26400
XXcwcnpde148-bak.XX 1623072
XXcwcnpde207-bak.XX 1344
XXcwcnpde209-bak.XX 2016

Sorted on numerical value of second column:
-------------------------------------------
XXcwcnpde207-bak.XX 1344
XXcwcnpde209-bak.XX 2016
XXclcnpde148-bak.XX 11808
XXclnXXcXXcde010-bak.XX 26400
XXcwcnpde148-bak.XX 1623072