如何合并线条和添加列值?

Com*_*low 2 python unix linux bash awk

所以我有一个像这样的laaaaaaaarge文件:

Item|Cost1|Cost2
Pizza|50|25
Sugar|100|100
Spices|100|200
Pizza|100|25
Sugar|200|100
Pizza|50|100
Run Code Online (Sandbox Code Playgroud)

我想为特定项添加所有Cost1s和Cost2s并生成合并输出.

我写了一个python代码来做到这一点,

item_dict = {}
for line in file:
    fields = line.split('|')
    item = fields[0]
    cost1 = fields[1]
    cost2 = fields[2]
    if item_dict.has_key(item):
        item_dict[item][0] += int(cost1)
        item_dict[item][1] += int(cost2)
    else:
        item_dict[item] = [int(cost1),int(cost2)]

for key, val in item_dict.items():
    print key,"|".join(val)
Run Code Online (Sandbox Code Playgroud)

无论如何,在awk或使用任何其他魔法中非常有效和快速地执行此操作?

或者我可以让我的python更优雅,更快?

预期产出

Pizza|200|150
Sugar|300|200
Spices|100|200
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 10

像这样......

$ awk 'BEGIN{OFS=FS="|"}
  NR>1 {cost1[$1]+=$2; cost2[$1]+=$3} 
  END{ for (i in cost1) print i, cost1[i], cost2[i]}' file
Sugar|300|200
Spices|100|200
Pizza|200|150
Run Code Online (Sandbox Code Playgroud)

说明

  • BEGIN{OFS=FS="|"}将(输入和输出)字段分隔符设置为|.
  • NR>1 意味着我们将对大于1的行号进行一些操作.这样我们就跳过标题.
  • cost1并且cost2是索引是第一个字段的数组,它的值是该点之前的总和.
  • END {}是我们在阅读完整个文件后所做的事情.它包括循环遍历数组并打印值.