根据公共字段合并文件

Merging files based on common fields

我正在尝试根据公共字段加入三个格式相似的文本文件,同时保留不常见的字段。这是一个例子:

文件 1:

  X
A 1
B 3
C 2
D 1

文件 2:

  Y
A 3
C 2
E 3

文件 3:

  Z
A 2
E 1
D 1
F 3

合并:

  X Y Z
A 1 3 2
B 3 - -
C 2 2 -
D 1 - 1
E - 3 1
F - - 3

不一定是 - 没有对应的值。这个问题 https://unix.stackexchange.com/questions/43417/join-two-files-with-matching-columns 中的 join 命令运行良好,只是它不保留不常见的字段。

谢谢。

join 无法完成您的要求,但这里有一个 Python 程序可以:

#!/usr/bin/env python                                                                                                   

import sys

files = map(open, sys.argv[1:]) # list of input files

headers = map(file.readline, files) # list of strings
headers = map(str.strip, headers)

blanks = ['-'] * len(headers)
data = {} # { rowname : [datum...] }                                                                   

for ii, infile in enumerate(files): # read each file
        for line in infile:
                key, value = line.split()
                if key not in data:
                        data[key] = blanks[:] # deep copy
                data[key][ii] = value

print '\t', '\t'.join(headers)

for key, values in sorted(data.iteritems()):
        print key, '\t', '\t'.join(values)