使用awk根据文件B中的匹配项选择文件A中的行

时间:2012-05-14 13:43:12

标签: awk

我有两个文件,文件A看起来像这样:

1       101427      GENE|ACT-A      1       101589      GENE|ACT-B    0.0357
1       101427      GENE|ACT-A      1       101785      GENE|ACT-C    0.6357
1       101427      GENE|TAD-J      1       101437      GENE|TAD-L    0.8967
1       101427      GENE|TAD-J      1       158988      GENE|TAD-O    0.0067
1       101427      GENE|TAD-J      1       159999      GENE|TAD-V    0.5427
1       101427      GENE|POL-D      1       101437      GENE|POL-H    0.2347

和文件B看起来像这样:

GENE|ACT-A
GENE|TAD-L
GENE|POL-D

我想选择文件A中的行,其中第3列或第6列在文件B中匹配。在上面的示例中,输出看起来像:

1       101427      GENE|ACT-A      1       101589      GENE|ACT-B    0.0357
1       101427      GENE|ACT-A      1       101785      GENE|ACT-C    0.6357
1       101427      GENE|TAD-J      1       101437      GENE|TAD-L    0.8967
1       101427      GENE|POL-D      1       101437      GENE|POL-H    0.2347

这可以通过一些awk简单地实现。

干杯。

2 个答案:

答案 0 :(得分:4)

awk 'FNR == NR {keys[$1]; next} $3 in keys || $6 in keys' fileB fileA

答案 1 :(得分:2)

我会使用awk解决方案,因为它只需要检查一次文件,但这里有一个替代方案。

{ join -1 3 <(sort -k3 fileA) <(sort fileB) 
  join -1 6 <(sort -k6 fileA) <(sort fileB)
} > output