Awk 从两个文件的列中匹配值需要大大加快速度

Awk 从两个文件的列中匹配值需要大大加快速度,awk,Awk,以下是脚本: #!/bin/bash LC_ALL=C while read line do gi=$(echo $line | awk '{print $2}') kegg=$(echo $line | awk '{print $1}') hitline=$(fgrep "$gi" blastoutput.tsv) if [ -n "$hitline" ] then echo "$hitline\t$kegg"

以下是脚本:

    #!/bin/bash
    LC_ALL=C
    while read line
    do
    gi=$(echo $line | awk '{print $2}')
    kegg=$(echo $line | awk '{print $1}')
    hitline=$(fgrep "$gi" blastoutput.tsv)
    if [ -n "$hitline" ]
    then
    echo "$hitline\t$kegg"
    fi
    done <genes_ncbi-gi.list.mod
我正在为脚本提供一个修改后的表格blast输出,如下所示:

    hsa:1   21071030
    hsa:10  116295260
    hsa:100 47078295
    ...
    consensus0_0_1_1142_+   gi  374264077   ref ZP_09622622.1       87.86   379 46  0   1   379 26  404 0.0  721
    consensus0_0_1_1142_+   gi  388456578   ref ZP_10138873.1       86.28   379 52  0   1   379 26  404 0.0  704
    consensus0_0_1_1142_+   gi  148358975   ref YP_001250182.1      87.34   379 48  0   1   379 26  404 0.0  703
    ...
剧本很好用。然而,这是难以置信的缓慢,它不会得到这样的工作完成

现在,我发现非常有用

我来的目的是:

    awk 'NR==FNR{a[$2];next}$3 in a{print $0}' genes_ncbi-gi.list.mod blastoutput.tsv
它工作起来很快。我剩下的问题是,我无法弄清楚如何让awk将第一个文件的第一列打印到第二个文件的第三列与数组匹配的行的末尾。很抱歉,我不得不对这件事有新的看法。我没有足够的声誉在链接的帖子中“评论”,也没有声誉在聊天中问这个问题。谢谢


同样,我想打印blanotput.tsv文件中的行,这些行在genes\u ncbi-gi.list.mod文件中有一个匹配的gi。此外,我想在匹配的blastoutput.tsv行的末尾打印genes\u ncbi-gi.list.mod的第一列。

不幸的是,join的输出说明符非常简单,因此必须指定每个字段

join -1 2 -2 3 -o 2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,2.10,2.11,2.12,2.13,2.14,2.15,1.1 <(sort -bk2,2 genes_ncbi-gi.list.mod) <(sort -bk3,3 blastoutput.tsv)

join-12-23-o2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,2.10,2.11,2.12,2.13,2.14,2.15,1.1基因文件的第二列应该与blast文件的第三列对应吗?给我们一个简短的输入示例和您想要的输出会很有帮助。是的,genes文件第二列中的值与blast文件第三列中的值相对应。但是,这两个文件都有许多独特的值。我只对两个表中的值感兴趣。我希望输出与blast输出一样,除了在末尾或开头有额外的列,该列有“hsa:1”或基因文件的第一列中碰巧有任何值。这看起来像是
join
的作业……这一个似乎有效。输出中的行数与awk行的输出中的行数完全相同。万分感谢!