我是该领域的新手,我想比较和合并 50000 个制表符分隔的文件,每个文件都有两列(“Position”和“Poly”)。 file1 和 file2 (以及其他文件)的示例以及我正在寻找的最终输出如下 -
文件1:
位置保利 100001℃ 228201T 341791 T 380441C 392640吨 459055A 459079 电话 480253 T 570405吨 492633A
文件2:
位置保利 100001℃ 312002C 341791 T 380441C 412640A 459055A 459079 电话 464056T 570405吨 492633A
输出:
位置 文件1 文件2 100001CC 228201 T- 312002-C 341791 TT 380441CC 392640 T- 412640-A 459055 AA 459079 电汇 480253 T- 464056-T 570405TT 492633 AA
基本上,我想将它们转换为单个矩阵,如果任何文件中缺少某个位置,则添加破折号。
答案1
join
GNU 的函数coreutils
确实几乎你想要什么 - 我找不到一种方法来一次性处理两个文件的遗漏,但是
sort -u \
<(join --header --nocheck-order -t$'\t' -a1 -o 1.1,1.2,2.2 -11 -21 -e'-' file1 file2) \
<(join --header --nocheck-order -t$'\t' -a2 -o 2.1,1.2,2.2 -11 -21 -e'-' file1 file2)
100001 C C
228201 T -
312002 - C
341791 T T
380441 C C
392640 T -
412640 - A
459055 A A
459079 T T
464056 - T
480253 T -
492633 A A
570405 T T
Position Poly Poly
标题行被排序到底部 - 如果这是一个问题,您可以通过管道sed '$d'
或将其删除head -n -1
。或者,如果未排序的输出是可接受的,您可以使用awk
而不是sort -u
ie删除重复项
awk '!a[$1]++' \
<(join --header --nocheck-order -t$'\t' -a1 -o 1.1,1.2,2.2 -11 -21 -e'-' file1 file2) \
<(join --header --nocheck-order -t$'\t' -a2 -o 2.1,1.2,2.2 -11 -21 -e'-' file1 file2)
Position Poly Poly
100001 C C
228201 T -
341791 T T
380441 C C
392640 T -
459055 A A
459079 T T
480253 T -
570405 T T
492633 A A
312002 - C
412640 - A
464056 - T
答案2
一个gawk
解决方案,使用每两个文件,并且您不介意输出的顺序:
$ awk '
FNR == NR {
if (FNR == 1) {header = "Position "FILENAME;next}
a[$1] = $2;
next;
}
{
if (FNR == 1) {header = header" "FILENAME;next}
if ($1 in a) {
a[$1] = a[$1]" "$2;
}
else {
a[$1] = "- "$2;
}
}
END {
print header;
for (i in a) {
print i,length(a[i]) == 1 ? a[i]" -" : a[i];
}
}
' file1 file2
Position file1 file2
412640 - A
380441 C C
392640 T -
570405 T T
341791 T T
459079 T T
464056 - T
228201 T -
312002 - C
100001 C C
480253 T -
492633 A A
459055 A A
答案3
如果python
没问题,并且两个文件的输出顺序没有问题:
f = open("path to file1", "r")
g = open("path to file2", "r")
pos_1 = []
pos_2 = []
poly_1 = []
poly_2 = []
for line in f:
line = line.strip('\n')
a, b = line.split(' ')
pos_1.append(a)
poly_1.append(b)
for line in g:
line = line.strip('\n')
a, b = line.split(' ')
pos_2.append(a)
poly_2.append(b)
res = pos_1 + pos_2
result = []
for pos in res:
val1 = "-"
val2 = "-"
if pos in pos_1:
val1 = poly_1[pos_1.index(pos)]
if pos in pos_2:
val2 = poly_2[pos_2.index(pos)]
t = (pos, val1, val2)
result.append(t)
result = set(result) // to remove duplicates
for val in result:
pos = val[0]
val1 = val[1]
val2 = val[2]
ans = str(pos)+" "+str(val1)+" "+str(val2)
print ans
这是在 python 2.7 中,对于 python 3,用 print() 函数替换 print 。