根据公共字段合并文件
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)
我正在尝试根据公共字段加入三个格式相似的文本文件,同时保留不常见的字段。这是一个例子:
文件 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)