我正在尝试使用$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中的所有项放入数组a
,NR==FNR
用于确保仅使用file1。在第二部分中,将FS
设置为空格或"="
,并比较$7
中file2
是否在此数组中是否为a,如果是,则将其打印出来。< / p>
答案 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