加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash – 根据列添加行中的值

发布时间:2020-12-15 21:00:54 所属栏目:安全 来源:网络整理
导读:我的csv文件中的第二列有重复项.我想根据这些重复项添加第1列中的关联值. 示例csv: 56,cc=DK49,cc=US34,cc=GB32,cc=DE32,cc=NZ31,cc=DK31,cc=GB31,cc=GB 示例结果: 96,cc=GB # where 96 = 34+31+3187,cc=DK # where 87 = 56+3132,cc=NZ 解决方法 您可以在a
我的csv文件中的第二列有重复项.我想根据这些重复项添加第1列中的关联值.

示例csv:

56,cc=DK
49,cc=US
34,cc=GB
32,cc=DE
32,cc=NZ
31,cc=DK
31,cc=GB
31,cc=GB

示例结果:

96,cc=GB # where 96 = 34+31+31
87,cc=DK # where 87 = 56+31
32,cc=NZ

解决方法

您可以在awk中使用关联数组:

awk '{s[$2]+=$1}END{for(k in s)print s[k]",",k}' inFile

为了便于阅读而扩展,并使用sum / key而不是s / k:

{                                 # Do for each line.
    sum[$2] += $1                 # Add first field to accumulator,#   indexed by second field.
                                  #   initial value is zero.
}
END {                             # Do this bit when whole file processed.
    for (key in sum)              # For each key like cc=US:
        print sum[key] "," key   # Output the sum and key.
}

这是我的盒子上运行的示例:

pax$echo;echo '56,cc=GB' | awk '{s[$2]+=$1}END{for(k in s)print s[k]","k}'

32,cc=DE
96,cc=NZ
49,cc=US
87,cc=DK

尽管第一列的格式为999(注意末尾的逗号),但这只是因为awk在评估数字上下文中的字符串时,只使用在该上下文中有效的前缀.因此45xyzzy将变为45,更重要的是,49变为49.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读