这是脚本:
#!/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的第一列。
答案 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