按列值合并多行到单行

6 投票
6 回答
4139 浏览
提问于 2025-04-16 19:37

我有一个用制表符分隔的文本文件,这个文件非常大。文件中的很多行在某一列的值是相同的。我想把这些相同的值放到同一行里。比如:

a foo
a bar
a foo2
b bar
c bar2

运行这个脚本后,它应该变成:

a foo;bar;foo2
b bar
c bar2

我该如何在shell脚本或Python中做到这一点呢?

谢谢。

6 个回答

1

在Python 2.7中进行了测试:

import csv

data = {}

reader = csv.DictReader(open('infile','r'),fieldnames=['key','value'],delimiter='\t')
for row in reader:
    if row['key'] in data:
        data[row['key']].append(row['value'])
    else:
        data[row['key']] = [row['value']]

writer = open('outfile','w')
for key in data:
    writer.write(key + '\t' + ';'.join(data[key]) + '\n')
writer.close()
2
from collections import defaultdict

items = defaultdict(list)
for line in open('sourcefile'):
    key, val = line.split('\t')
    items[key].append(val)

result = open('result', 'w')
for k in sorted(items):
    result.write('%s\t%s\n' % (k, ';'.join(items[k])))
result.close()  

没有经过测试

3

你可以用awk来试试这个

{   a[$1] = a[$1] ";" $2 }
END { for (item in a ) print item, a[item] }

所以如果你把这个awk脚本保存为一个叫做awkf.awk的文件,而你的输入文件是ifile.txt,运行这个脚本的方法是

awk -f awkf.awk ifile.txt | sed 's/ ;/ /'

sed脚本是用来去掉开头的分号;

希望这对你有帮助

撰写回答