我有两个非常长的由空格分隔的文件,看起来像这样:
文件1:
CHR SNP A1 A2 MAF
1 rs12 A G 0.43
1 rs1 A T 0.22
1 1:30 G A 0.012
1 rs23 G A 0.012
文件2:
SNP CHR A1 A2 MAF CHR:BP
rs21 1 G A 0.03 1:30
rs13 1 T A 0.06 1:122
rs23 1 A G 0.02 1:234
我希望将它们合并在一起,当文件1的第2列与文件2的第1列或文件2的第6列匹配时,打印两个文件的所有列。因此,对于示例,我的输出应该是: file 3。
SNP CHR A1 A2 MAF CHR:BP CHR SNP A1 A2 MAF
rs21 1 G A 0.03 1:30 1 1:30 G A 0.012
rs23 1 A G 0.02 1:234 1 rs23 G A 0.012
我使用了以下代码:
awk 'NR==FNR{a[$2]=$0;next} ($1 in a || $6 in a){print $0 FS a[$2]}' file1 file2 > file3
但不知何故,它过滤掉了正确的行,但只打印file2的列而非file1的列。我也尝试使用join,但即使文件已经排序,它也会给出奇怪的结果。所谓奇怪是指,它大约省略了1/5实际存在于两个文件中的行。但为了完整性,这是我尝试使用join的代码:
join -1 2 -2 1 -o '2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 1.1 1.2 1.3 1.4 1.5 1.6' <(sort -k2 file1) <(sort -k1 file2) > file3.1
join -1 2 -2 6 -o '2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 1.1 1.2 1.3 1.4 1.5 1.6' <(sort -k2 file1) <(sort -k6 file2) > file3.2
cat file3.1 file 3.2 > file3
有人看到我的错误了吗?非常感激。 谢谢!
1
。当您编写测试代码$1 in a || $6 in a
时,显然已经知道了这一点,并且在想要打印a[rs21]
时也没有改变。 - Ed Morton