【问题标题】:awk load one file into array, test against another fileawk 将一个文件加载到数组中,对另一个文件进行测试
【发布时间】:2016-05-04 05:26:12
【问题描述】:

我有两个文件:

seqs.fa:

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

数字.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,有没有更好的方法来实现这个目标?

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    修正数字文件中的错字后

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

    【讨论】:

    • 谢谢,已编辑问题以删除错字。这给出了所需的输出。任何想法为什么我上面的 awk 命令不起作用?
    • 您必须在标头中匹配 $1 而不是相反,但这是一种低效的方法。
    • 我想这就是我正在做的,调用是match(string, regex)(不像我在python中习惯的匹配函数)source
    • 对,那也许是你的记录结构。在您的第二个文件中将只有一条记录。
    【解决方案2】:

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

    grep -F -f numbers.txt seqs.fa
    

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

    【讨论】:

    • 请注意,这将匹配文件中任何出现的子字符串。
    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2020-03-19
    • 2016-10-24
    • 2023-03-10
    • 2013-03-12
    相关资源
    最近更新 更多