我有 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。