2016-03-01 49 views
0

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

file1的

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中到用于确保仅file1的使用阵列aNR==FNR。在第二部分中,将FS设置为空格或"=",然后比较$7中的file2是否在此数组中,如果是,则打印它。

+1

非常感谢你:)。我以为我需要循环通过file1迭代,但我现在看到我不是正确的,再次感谢:)。 – Chris

回答

2

只是删除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

你不需要使用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 
+2

这不会限制比赛只有一个领域。 – karakfa

+1

也不会将其限制为整个字段,它将执行部分匹配,因此如果'file1'包含'AGRN1'且file2包含'AGRN12'则它将被视为匹配。如果它包含与file1中任何内容的部分匹配,它也会复制标题行。 –

+1

你们都是对的,我不认为它 – ClaudioM