Bash - 根据列在行中添加值

标签 bash csv awk sed command-line-interface

我的 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=DE
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=DK
49,  cc=US
34,  cc=GB
32,  cc=DE
32,  cc=NZ
31,  cc=DK
31,  cc=GB
31,  cc=GB' | awk '{s[$2]+=$1}END{for(k in s)print s[k]", "k}'

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

尽管第一列的形式是 999,(注意末尾的逗号),但它仍然有效,只是因为 awk,在计算字符串时数字上下文,仅使用在该上下文中有效的前缀。因此,45xyzzy 将变为 45,更重要的是,49, 变为 49

关于Bash - 根据列在行中添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29385613/

相关文章:

linux - 变量在 sed 内的 shell 脚本中不起作用

linux - 如何使用 sed 替换退格字符 (\b)?

Azure 数据工厂将 CSV 文件拆分为多个 CSV 文件?

返回比 Linux `wc -l` 高得多的行数的 Python 代码

linux - 在文件中搜索字符串的最后一次出现并 append 到它

linux - 根据环境更改命令的脚本

windows - 权限被拒绝(公钥)-Windows 上的 Git Bash

python - Concat pandas dataframe 组合无序

linux - 在 Mac OS X 上使用 AWK 拆分文件

linux - 如何编写脚本对多个 csv 文件执行一些基本操作