我想在 Linux 机器上加入两个文件。我想加入仅包含在第一个文件中的行。
第一个文件是解压缩的文件(没有标题,只有一列)。
1_4
3_4
4_63
6_2
第二个文件是 gz 文件(带标题,16 列)。
CHR POS rsid SNPID Allele1 Allele2 AC_Allele2 AF_Allele2 imputationInfo N BETA SE Tstat p.value p.value.NA Is.SPA.converge
1 4 78 42 850 284 102 478 199 3777 485 2.5 2.4 23 35 336
8 3 74 24 0 2485 21 48 9 77 85 0.5 5.4 42 4312 335
many more lines
我尝试如下。
join -11 -21 <(cat file1 | sort -k1,1) <(zcat file2.gz | sed 1,1d | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | sort -k1,1) | awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}' > outfile
输出文件不仅包括第一个文件中包含的行。有人知道出了什么问题吗?
提前致谢!
答案1
您遇到一个错误,这意味着您将错过 file2 中的第一行。您既sed 1,1d
可以删除第一行、标题,也NR>1
可以awk
再次跳过第一行。你可能想要这个:
join -11 -21 <(cat file1 | sort -k1,1) \
<(zcat file2.gz | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | sort -k1,1) |
awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}'
也就是说,其他一切都应该按照您的描述进行。我使用这些示例文件进行了测试:
$ cat file1
1_4
3_4
4_63
6_2
和
$ zcat file2
CHR POS rsid SNPID Allele1 Allele2 AC_Allele2 AF_Allele2 imputationInfo N BETA SE Tstat p.value p.value.NA Is.SPA.converge
1 4 78 42 850 284 102 478 199 3777 485 2.5 2.4 23 35 336
1 8 78 42 850 284 102 478 199 3777 485 2.5 2.4 23 35 336
而且,正如预期的那样,我只得到一行输出1_4
:
$ join -11 -21 <(cat file1 | sort -k1,1) \
<(zcat file2.gz | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' |
sort -k1,1) |
awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}'
1_4 1 4 850 42 677 102 3777 485 284
如果这不是您所看到的,请编辑您的问题并包含一个我们实际上可以用来重现错误的示例。