匹配两个文件中的行

时间:2014-09-05 09:32:02

标签: bash perl awk

我有两个制表符分隔文件:

档案A

chrM    150
chrM    5581
chr1    717485
chr1    719097

档案B

chrM    150
chrX    5581
chr1    717485
chr2    719097

只应打印两个文件中存在的行:

   chrM 150

    chr1    717485

第二个问题,如果我在两个文件中都有多个列,如何匹配两个文件的前两列,如果匹配,则打印第一个文件中的行。 样本数据

档案A

150 .   T   C   7807.77 PASS    AC=2;AF=1.00;AN=2;DP=247;Dels=0.00;FS=0.000;HaplotypeScore=4.7038;MLEAC=2;MLEAF=1.00;MQ=51.13;MQ0=0;QD=31.61;VQSLOD=3.92;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||) GT:AD:DP:GQ:PL  1/1:0,247:247:99:7836,727,0
chrM    195 .   C   T   5638.77 PASS    AC=2;AF=1.00;AN=2;DP=176;Dels=0.00;FS=0.000;HaplotypeScore=2.5193;MLEAC=2;MLEAF=1.00;MQ=42.23;MQ0=0;QD=32.04;VQSLOD=3.62;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||) GT:AD:DP:GQ:PL  1/1:0,176:176:99:5667,517,0
chrM    199 rs72619362  T   C   5058.77 PASS    AC=2;AF=1.00;AN=2;DB;DP=169;Dels=0.00;FS=0.000;HaplotypeScore=0.7887;MLEAC=2;MLEAF=1.00;MQ=39.55;MQ0=0;QD=29.93;VQSLOD=4.68;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||)  GT:AD:DP:GQ:PL  1/1:0,169:169:99:5087,472,0
chrM    204 rs3135032   T   C   4110.77 PASS    AC=2;AF=1.00;AN=2;DB;DP=168;Dels=0.00;FS=0.000;HaplotypeScore=0.0000;MLEAC=2;MLEAF=1.00;MQ=39.77;MQ0=0;QD=24.47;VQSLOD=2.90;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||)  GT:AD:DP:GQ:PL  1/1:0,168:168:99:4139,435,0
chrM    217 rs41531144  T   C   4589.77 PASS    AC=2;AF=1.00;AN=2;DB;DP=147;Dels=0.00;FS=0.000;HaplotypeScore=0.0000;MLEAC=2;MLEAF=1.00;MQ=42.78;MQ0=0;QD=31.22;VQSLOD=4.51;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||)  GT:AD:DP:GQ:PL  1/1:0,147:147:99:4618,418,0

档案B

150 .   T   C   7807.77 PASS    AC=2;AF=1.00;AN=2;DP=247;Dels=0.00;FS=0.000;HaplotypeScore=4.7038;MLEAC=2;MLEAF=1.00;MQ=51.13;MQ0=0;QD=31.61;VQSLOD=3.92;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||) GT:AD:DP:GQ:PL  1/1:0,247:247:99:7836,727,0
chrM    195 .   C   T   5638.77 PASS    AC=2;AF=1.00;AN=2;DP=176;Dels=0.00;FS=0.000;HaplotypeScore=2.5193;MLEAC=2;MLEAF=1.00;MQ=42.23;MQ0=0;QD=32.04;VQSLOD=3.62;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||) GT:AD:DP:GQ:PL  1/1:0,176:176:99:5667,517,0
chrM    199 rs72619362  T   C   5058.77 PASS    AC=2;AF=1.00;AN=2;DB;DP=169;Dels=0.00;FS=0.000;HaplotypeScore=0.7887;MLEAC=2;MLEAF=1.00;MQ=39.55;MQ0=0;QD=29.93;VQSLOD=4.68;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||)  GT:AD:DP:GQ:PL  1/1:0,169:169:99:5087,472,0
chrM    205 rs3135032   T   C   4110.77 PASS    AC=2;AF=1.00;AN=2;DB;DP=168;Dels=0.00;FS=0.000;HaplotypeScore=0.0000;MLEAC=2;MLEAF=1.00;MQ=39.77;MQ0=0;QD=24.47;VQSLOD=2.90;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||)  GT:AD:DP:GQ:PL  1/1:0,168:168:99:4139,435,0
chrM    214 rs41531144  T   C   4589.77 PASS    AC=2;AF=1.00;AN=2;DB;DP=147;Dels=0.00;FS=0.000;HaplotypeScore=0.0000;MLEAC=2;MLEAF=1.00;MQ=42.78;MQ0=0;QD=31.22;VQSLOD=4.51;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||)  GT:AD:DP:GQ:PL  1/1:0,147:147:99:4618,418,0

输出

150 .   T   C   7807.77 PASS    AC=2;AF=1.00;AN=2;DP=247;Dels=0.00;FS=0.000;HaplotypeScore=4.7038;MLEAC=2;MLEAF=1.00;MQ=51.13;MQ0=0;QD=31.61;VQSLOD=3.92;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||) GT:AD:DP:GQ:PL  1/1:0,247:247:99:7836,727,0
chrM    195 .   C   T   5638.77 PASS    AC=2;AF=1.00;AN=2;DP=176;Dels=0.00;FS=0.000;HaplotypeScore=2.5193;MLEAC=2;MLEAF=1.00;MQ=42.23;MQ0=0;QD=32.04;VQSLOD=3.62;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||) GT:AD:DP:GQ:PL  1/1:0,176:176:99:5667,517,0
chrM    199 rs72619362  T   C   5058.77 PASS    AC=2;AF=1.00;AN=2;DB;DP=169;Dels=0.00;FS=0.000;HaplotypeScore=0.7887;MLEAC=2;MLEAF=1.00;MQ=39.55;MQ0=0;QD=29.93;VQSLOD=4.68;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||)  GT:AD:DP:GQ:PL  1/1:0,169:169:99:5087,472,0

谢谢

3 个答案:

答案 0 :(得分:4)

您可以将其中一个文件读入%s哈希,其中键是行,并使用哈希作为查找表循环其他,

perl -ne 'BEGIN{local @ARGV=pop; @s{<>} = ()} print if exists $s{$_}' fileA fileB

切换

  • -n:为输入文件中的每个“行”创建一个while(<>){...}循环。
  • -e:告诉perl在命令行上执行代码。

答案 1 :(得分:3)

-f中文件(AB中的一个或多个新行分隔模式:

% grep -f A B   
chrM    150
chr1    717485

答案 2 :(得分:3)

grep -f是方式......但是已经由Johnsyweb指出。

来自man grep

  

-f FILE , - file = FILE

     

从FILE获取模式,每行一个。空文件包含零   模式,因此没有匹配。 (-f由...指定   POSIX)

使用awk您也可以:

$ awk 'FNR==NR {a[$0]; next} $0 in a' f1 f2
chrM    150
chr1    717485

更新

如果您只需匹配前两列,则不能再使用grep(至少在简单模式下)。这个awk使它(更新,thanks Ed Morton!):

$ awk 'NR==FNR {a[$1,$2]; next} ($1,$2) in a' f2 f1
150 .   T   C   7807.77 PASS    AC=2;AF=1.00;AN=2;DP=247;Dels=0.00;FS=0.000;HaplotypeScore=4.7038;MLEAC=2;MLEAF=1.00;MQ=51.13;MQ0=0;QD=31.61;VQSLOD=3.92;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||) GT:AD:DP:GQ:PL  1/1:0,247:247:99:7836,727,0
chrM    195 .   C   T   5638.77 PASS    AC=2;AF=1.00;AN=2;DP=176;Dels=0.00;FS=0.000;HaplotypeScore=2.5193;MLEAC=2;MLEAF=1.00;MQ=42.23;MQ0=0;QD=32.04;VQSLOD=3.62;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||) GT:AD:DP:GQ:PL  1/1:0,176:176:99:5667,517,0
chrM    199 rs72619362  T   C   5058.77 PASS    AC=2;AF=1.00;AN=2;DB;DP=169;Dels=0.00;FS=0.000;HaplotypeScore=0.7887;MLEAC=2;MLEAF=1.00;MQ=39.55;MQ0=0;QD=29.93;VQSLOD=4.68;culprit=MQ;EFF=intergenic_region(MODIFIER||||||||)  GT:AD:DP:GQ:PL  1/1:0,169:169:99:5087,472,0