【问题标题】:To sum all corresponding fields of 2nd column for each occurrence of fields in the first column对第一列中每次出现的字段求和第二列的所有对应字段
【发布时间】:2013-11-21 08:51:00
【问题描述】:
$ 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

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

【问题讨论】:

    标签: awk


    【解决方案1】:

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

    awk '{sum2[$1] += $2}; END{ for (id in sum2) { print id, sum2[id] } }' < input
    

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

    【讨论】:

    • 谢谢,下面的命令运行良好 awk '{a[$1]+=$2} END {for (x in a) print x, a[x]}' file 请告诉我如何获取排序后的输出。使用第 2 列的相应值对第 1 列进行排序。并且还使用第 1 列的相应值对第 2 列进行排序
    • 请注意awk '{commands}' file 绰绰有余,您不需要&lt; file
    【解决方案2】:

    尝试在您的结果中关注awk

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

    输出:

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

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

    bpimagelist ... | awk '/^IMAGE/ {a[$2]+=$19} END {for (x in a) print x, a[x]}'
    

    编辑 (根据 OP 的评论)

    如何获得排序后的输出。使用相应的值对第 1 列进行排序 第 2 列的 & 也用相应的列值对第 2 列进行排序 1

    最简单的方法是使用sort

    • 按第 1 列排序

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

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

    • 在第 2 列排序

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

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

    【讨论】:

    • 谢谢,下面的命令运行良好 awk '{a[$1]+=$2} END {for (x in a) print x, a[x]}' file 请告诉我如何获取排序后的输出。用第 2 列的对应值对第 1 列进行排序。同时用第 1 列的对应值对第 2 列进行排序。
    • @user3016638 请检查我的回答中的编辑。
    【解决方案3】:

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

    gawk -f a.awk file
    

    a.awk 在哪里:

    { 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]
        }
    }
    

    给出输出:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2012-12-13
      • 1970-01-01
      • 2018-04-04
      • 2021-09-14
      • 1970-01-01
      • 2020-08-08
      相关资源
      最近更新 更多