匹配来自两个文件的列的值,需要大大加快速度

时间:2013-12-04 14:14:05

标签: 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"
    fi
    done <genes_ncbi-gi.list.mod

genes_ncbi-gi.list.mod有11,461,266行,看起来像:

    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
    ...

脚本有效。然而,它的速度非常慢,并且不能完成工作。

现在,我发现this thread非常有帮助。

我来到了:

    awk 'NR==FNR{a[$2];next}$3 in a{print $0}' genes_ncbi-gi.list.mod blastoutput.tsv

它的工作原理非常快。我剩下的问题是,我无法弄清楚如何使awk打印第一个文件的第一列到第二个文件的行的末尾,它们与第三列与数组匹配。对不起,我不得不为此制作新的帖子。我没有足够的声誉在链接的帖子中“评论”这个,我也没有在聊天中提出这个问题的声誉。感谢。

再次:我想打印blastoutput.tsv文件中的lines_ncbi-gi.list.mod文件中具有匹配的gi的行。另外,我想在匹配的blastoutput.tsv行的末尾打印genes_ncbi-gi.list.mod的第一列。

1 个答案:

答案 0 :(得分:0)

不幸的是,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)

我假设你的shell是bash / ksh / zsh