如何合并行和添加列值?

2024-05-13 08:10:12 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个如下的laaaaaarge文件:

Item|Cost1|Cost2
Pizza|50|25
Sugar|100|100
Spices|100|200
Pizza|100|25
Sugar|200|100
Pizza|50|100

我想为一个特定的项添加所有的Cost1Cost2,并生成一个合并的输出。在

我已经编写了一个python代码来实现这一点

^{pr2}$

有没有什么办法可以在awk中或者使用其他的魔法来快速高效地完成这个任务呢?在

或者我可以让我的python变得更优雅更快?在

预期输出

Pizza|200|150
Sugar|300|200
Spices|100|200

Tags: 文件代码魔法sugaritemawk办法pizza
3条回答

像这样。。。在

$ 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

说明

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

实际上,我会做fedorqui所做的事情。但是,为了完整起见,此python脚本应该比原始脚本快:

#!/usr/bin/env python

import fileinput

item_dict = {}

for line in fileinput.input():
    if not fileinput.isfirstline():
        fields = line.strip().split('|')
        item = fields[0]
        cost1 = int(fields[1])
        cost2 = int(fields[2])
        try:
            item_dict[item][0] += cost1
            item_dict[item][1] += cost2
        except KeyError:
            item_dict[item] = [cost1, cost2]

for key, val in item_dict.items():
    print "%s|%s|%s" % (key,val[0],val[1])

将脚本保存到一个文件中,如sumcols,并使其可执行chmod +x sumcols,运行方式如下:

^{pr2}$
awk '
    BEGIN { FS=OFS="|" }
    NR==1 { expectedNF = NF; next }
    NF != expectedNF { print "Fix your #%@#&! data, idiot!"; exit 1 }'
    {
        items[$1]
        for (c=2;c<=NF;c++)
            cost[$1,c] += $c
    } 
    END {
        for (i in items) {
            printf "%s", i
            for (c=2;c<=NF;c++)
                printf "%s%s", OFS, cost[i,c]
            print ""
        }
    }
' file

如果你认为合适的话,可以随意压缩成1到2行。在

相关问题 更多 >