【发布时间】: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