匹配gzip文件中的多个列

时间:2016-08-02 06:02:56

标签: shell awk

我希望在不解压缩file2的情况下匹配file1.txt和file2.gz之间的多个列。

file 1.txt:
1       11710779        -
1       12919623        CC


file2.gz:

1       13380   .       C       G       7829.15 VQSRTrancheSNP99.60to99.80      AC=30;AC_AFR=14;AC_AMR=1;AC_Adj=15;AC_EAS=0;AC_FIN=0
1       13382   .       C       G       320.40  VQSRTrancheSNP99.60to99.80      AC=3;AC_AFR=0;AC_AMR=0;AC_Adj=1;AC_EAS=0;AC_FIN=0;AC
1 

我希望将file1.txt中的$ 1,$ 2,3与file.gz中的$ 1,$ 2,$ 4匹配,并返回file2中的所有行。

我试过

awk -F '\t' 'NR==FNR{c[$1$2$4]++;next};c[$1$2$3] > 0' file2.gz file1.txt

 awk -F '\t'  'NR==FNR{a[$1,$2,$3]++;next} (a[$1,$2,$4])' file1.txt file2.gz

这两个命令都不起作用。当我单独grep其中一些时,file1中的内容存在于file2中。 在运行命令之前,我不确定是否需要首先解压缩file2。我无法解压缩文件,因为它太大了。

2 个答案:

答案 0 :(得分:1)

尝试这种方法:

$ cat > test.in
1 2
3 4
$ gzip test.in
$ awk '{print $1}' <(gunzip -c test.in.gz)
1
3

答案 1 :(得分:1)

zcat file2.txt.gz | awk -F '\t'  'NR==FNR{a[$1,$2,$3]++;next} a[$1,$2,$4]' file1.txt -

awk的两个文件参数是file1.txt-。第二个文件-告诉awk从标准输入读取file2.txt.gz

中的管道输入

实施例

让我们考虑这两个示例文件:

$ cat file1.txt
1       11710779        -
1       12919623        CC
1       13382   C

$ zcat file2.txt.gz
1       13380   .       C       G       7829.15 VQSRTrancheSNP99.60to99.80      AC=30;AC_AFR=14;AC_AMR=1;AC_Adj=15;AC_EAS=0;AC_FIN=0
1       13382   .       C       G       320.40  VQSRTrancheSNP99.60to99.80      AC=3;AC_AFR=0;AC_AMR=0;AC_Adj=1;AC_EAS=0;AC_FIN=0;AC

现在,让我们运行命令:

$ zcat file2.txt.gz | awk -F '\t'  'NR==FNR{a[$1,$2,$3]++;next} a[$1,$2,$4]' file1.txt -
1       13382   .       C       G       320.40  VQSRTrancheSNP99.60to99.80      AC=3;AC_AFR=0;AC_AMR=0;AC_Adj=1;AC_EAS=0;AC_FIN=0;AC