【问题标题】:Matching values from columns from two files, need to speed things up dramatically匹配来自两个文件的列的值,需要显着加快速度
【发布时间】:2013-12-04 14:14:05
【问题描述】:

这是脚本:

    #!/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 文件中在genes_ncbi-gi.list.mod 文件中具有匹配gi 的行。此外,我想在匹配的blastoutput.tsv 行的末尾打印genes_ncbi-gi.list.mod 的第一列。

【问题讨论】:

  • 基因文件的第二列是否应该与blast文件的第三列对应?给我们一个简短的输入示例和您想要的输出将会很有帮助。
  • 是的,genes文件第二列的值对应blast文件第三列的值。但是,这两个文件都有很多独特的值。我只对两个表中的值感兴趣。我希望输出就像爆炸输出一样,除了末尾或开头有“hsa:1”的额外列或基因文件第一列中发生的任何值。
  • 这看起来像是 join 的工作...

标签: awk


【解决方案1】:

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

【讨论】:

  • 这个似乎有效。输出中的行数与 awk 行的输出中的行数完全相同。谢谢一百万!
猜你喜欢
  • 2018-01-12
  • 2021-10-01
  • 2016-12-21
  • 2020-07-20
  • 2017-07-19
  • 2015-09-19
  • 2020-10-21
  • 1970-01-01
  • 2020-09-23
相关资源
最近更新 更多