linux下如何连接两个文件?

linux下如何连接两个文件?

我想在 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
    

如果这不是您所看到的,请编辑您的问题并包含一个我们实际上可以用来重现错误的示例。

相关内容