使用五列提取文件子集

使用五列提取文件子集

我有 2 个文件,一个是 biiiiig 文件(有 249430 行),另一个比第一个文件(500 行)小

第一个文件有这五列和其他列(第二个文件中的前五列相同),例如

#CHROM     POS         ID          REF      ALT     QUAL    INFO 
chr2       32424454        rs4576493      T       G       pass    ......
chr8       35578788        rs3686678      C       A        pass .........
chr8       35578788        rs3686678      C       CCG      pass .........
chrx       35578788        rs3686678      C       CCG      pass .........

在第二个文件中有 5 列,例如:

#CHROM     POS         ID          REF      ALT
chr2       32424454        rs4576493      T       G
chr8       35578788        rs3686678      C       CCG

我想将第二个文件与第一个文件的每五列进行比较,然后仅保存文件之间的交集行(但在文件 1 中包含所有列)

所以我想要的最终文件是这样的

#CHROM     POS         ID          REF      ALT     QUAL    INFO 
chr2       32424454        rs4576493      T       G       pass    ......
chr8       35578788        rs3686678      C       CCG      pass .........

请问在unix下我该怎么做?谢谢

答案1

使用任何 awk:

awk '
    { key = $1 FS $2 FS $3 FS $4 FS $5 }
    NR==FNR { a[key]; next }
    key in a
' file2 file1

答案2

假设这两个文件都是 TSV 文件,即制表符分隔,您可以使用磨坊主mlr;专门为处理结构化数据而开发的工具)使用您提到的五个字段在两个数据集之间执行关系 INNER JOIN 操作:

$ mlr --tsv join -f firstfile -j '#CHROM,POS,ID,REF,ALT' secondfile
#CHROM  POS     ID      REF     ALT     QUAL    INFO
chr2    32424454        rs4576493       T       G       pass    ......
chr8    35578788        rs3686678       C       CCG     pass    .........

您的数据是否使用多个空格代替单个制表符,使用--pprint代替 来--tsv表示您希望输入和输出都“漂亮打印”。使用--p2t(或--ipprint--otsv) 将输入读取为“漂亮打印”格式,但将输出写入为 TSV。

相关内容