awk将一个文件加载到数组中,对另一个文件进行测试

时间:2016-05-03 21:19:16

标签: bash awk

我有两个文件:

seqs.fa:

>seq000007;size=72768;
ACTGTGAG
>seq000010;size=53132;
GTAAGATC
GAATTCTT
>seq00045;size=40321;
ACCCATTT
...  

numbers.txt

72768
53132

我想要的输出是第一个文件中与第二个文件中的数字匹配的行:

>seq000007;size=72768;
>seq000010;size=53132;

我尝试使用awk,但它只返回与第一个数字匹配的行:

awk -F"\n" -v RS=">" 'NR==FNR{for(i=1;i<=NF;i++) A[$i]; next} END {for (header in A) {if ( match(header,$1) ) {print header}}}'  seqs.fa numbers.txt

seq000007;size=72768;
seq072768;size=1;

为什么awk只循环遍历numbers.txt中第一行的“header”数组?而且,如果这是XY problem,是否有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

修复数字文件中的拼写错误

$ awk -F'=|;' 'NR==FNR{a[$1]; next}; $3 in a' numbers.txt seqs.fa

>seq000007;size=72768;
>seq000010;size=53132;

答案 1 :(得分:0)

在这种特殊情况下,你可以像这样使用GNU grep:

grep -F -f numbers.txt seqs.fa

选项-f filename使用filename中找到的所有模式进行搜索。选项-F告诉grep,模式是简单的固定字符串。