awk按另一个特定字段过滤文件

时间:2016-03-01 16:55:02

标签: awk

我正在尝试使用$7(这只是一个唯一ID列表)过滤file2中的特定字段(file1)。下面的awk运行但不过滤文件(它保持不变)。谢谢你:)。

文件1

ACTA2
ACTC1
AGRN

file2的

Chr Start   End Ref Alt Func.refGene    Gene.refGene    GeneDetail.refGene
chr1    977330  977330  T   C   intronic    AGRN    0
chr1    981931  981931  A   G   exonic  AGRN    0
chr1    982994  982994  T   C   exonic  AGRN    0
chr1    1269554 1269554 T   C   exonic  TAS1R3  0
chr1    1647778 1647778 C   G   intronic    CDK11A  CDK11B
chr1    1647814 1647814 T   C   exonic  CDK11A  CDK11B

所需的输出

Chr Start   End Ref Alt Func.refGene    Gene.refGene    GeneDetail.refGene
chr1    977330  977330  T   C   intronic    AGRN    0
chr1    981931  981931  A   G   exonic  AGRN    0
chr1    982994  982994  T   C   exonic  AGRN    0

AWK

awk 'NR==FNR{for (i=1;i<=NF;i++) a[$i];next} !($7 in a)' file1 FS="[ =]"  file2 > output.txt 

a[$i]用于将file1中的所有项放入数组aNR==FNR用于确保仅使用file1。在第二部分中,将FS设置为空格或"=",并比较$7file2是否在此数组中是否为a,如果是,则将其打印出来。< / p>

2 个答案:

答案 0 :(得分:3)

只需删除file1和file2之间的FS="[ =]",然后将!替换为 FNR==1 ||

$ awk 'NR==FNR{for (i=1;i<=NF;i++) a[$i];next} FNR==1 || ($7 in a)' file1 file2

Chr Start   End Ref Alt Func.refGene    Gene.refGene    GeneDetail.refGene
chr1    977330  977330  T   C   intronic    AGRN    0
chr1    981931  981931  A   G   exonic  AGRN    0
chr1    982994  982994  T   C   exonic  AGRN    0

当然你不需要for循环

$ awk 'NR==FNR{a[$1];next} FNR==1 || ($7 in a)' file1 file2

答案 1 :(得分:-1)

您不需要使用awk您可以使用grep

grep -f file1.txt file2.txt

然后你可以写一个简单的bash脚本

#!/bin/bash
head -1 file2.txt
grep -f file1.txt file2.txt

输出

Chr Start   End Ref Alt Func.refGene    Gene.refGene    GeneDetail.refGene
chr1    977330  977330  T   C   intronic    AGRN    0
chr1    981931  981931  A   G   exonic  AGRN    0
chr1    982994  982994  T   C   exonic  AGRN    0