Bash脚本循环只运行一次

Bash脚本循环只运行一次,bash,loops,bioinformatics,Bash,Loops,Bioinformatics,我试图解析一个输入文件(我的测试文件是4行),然后查询一个在线生物数据库。然而,在返回第一个结果后,我的循环似乎停止了 #!/bin/bash if [ "$1" = "" ]; then echo "No input file to parse given. Give me a BLAST output file" else file=$1 #Extracts GI from each result and stores it on temp f

我试图解析一个输入文件(我的测试文件是4行),然后查询一个在线生物数据库。然而,在返回第一个结果后,我的循环似乎停止了

#!/bin/bash
if [ "$1" = "" ]; then
        echo "No input file to parse given. Give me a BLAST output file"
else
        file=$1
        #Extracts GI from each result and stores it on temp file.
        rm -rf /home/chris/TEMP/tempfile.txt
        awk -F '|' '{printf("%s\n",$2);}' "$file" >> /home/chris/TEMP/tempfile.txt
        #gets the species from each gi.
        input="/home/chris/TEMP/tempfile.txt"
        while read -r i
        do
                echo GI:"$i"
                /home/chris/EntrezDirect/edirect/esearch -db protein -query "$i" | /home/chris/EntrezDirect/edirect/efetch -format gpc | /home/chris/EntrezDirect/edirect/xtract -insd source o
rganism | cut -f2 
        done < "$input"
        rm -rf /home/chris/TEMP/tempfile.txt
fi
而我应该有4个结果。感谢您的帮助

这是示例输入的格式:

TARA042SRF022_1 gi|751637161|ref|WP_041104882.1|    40.4    151 82  2   999 547 1   143 2.8e-21 110.9
TARA042SRF022_2 gi|1057355277|ref|WP_068715547.1|   62.7    263 96  1   915 133 80  342 7.1e-96 358.6
TARA042SRF022_3 gi|950462516|ref|WP_057369049.1|    38.3    47  29  0   184 44  152 198 5.1e+01 36.2
TARA042SRF022_4 gi|918428433|ref|WP_052479609.1|    37.5    48  29  1   525 668 192 238 6.1e+01 37.0

使用
cut
从ASCII文件中提取列,使用
-d
选项表示分隔符,使用
-f
指定列。像这样把所有东西都绕成一个圈

$ cat data.txt
TARA042SRF022_1 gi|751637161|ref|WP_041104882.1|    40.4    151 82  2   999 547 1   143 2.8e-21 110.9
TARA042SRF022_2 gi|1057355277|ref|WP_068715547.1|   62.7    263 96  1   915 133 80  342 7.1e-96 358.6
TARA042SRF022_3 gi|950462516|ref|WP_057369049.1|    38.3    47  29  0   184 44  152 198 5.1e+01 36.2
TARA042SRF022_4 gi|918428433|ref|WP_052479609.1|    37.5    48  29  1   525 668 192 238 6.1e+01 37.0

$ cat t.sh
#!/bin/bash

for gi in $(cut -d"|" -f 2 data.txt); do
    echo $gi
done

$ bash t.sh
751637161
1057355277
950462516
918428433
编辑:
我无法重现该问题,但我觉得它与换行符和/或临时文件的使用有关。我的建议忽略了这一点,但没有回答您的实际问题(但我猜是您的问题)

第二次调用时,
read-r I
返回时的退出状态为非零,表明没有更多的数据要从输入文件读取。这通常意味着
while
循环中的命令也在读取标准输入,并且在
读取
之前消耗文件的剩余部分

这里唯一的候选命令是
esearch
,因为
echo
不从标准输入读取,其他命令都从管道中的上一个命令读取。重定向
esearch
的标准输入,以便它不会无意中消耗您的输入数据

while read -r i
do
    echo GI:"$i"
    /home/chris/EntrezDirect/edirect/esearch -db protein -query "$i" < /dev/null |
      /home/chris/EntrezDirect/edirect/efetch -format gpc |
      /home/chris/EntrezDirect/edirect/xtract -insd source organism |
      cut -f2 
done < "$input"
读取时-r i
做
echo GI:$i
/home/chris/EntrezDirect/edirect/esearch-db protein-query“$i”
您可以尝试从
/dev/null
重定向
esearch
的标准输入;在再次运行
read-ri
之前,它似乎正在读取输入文件的其余部分
esearch-db protein-query“$i”
。你可以这样简化你的awk:
awk-F'''''''{print$2}'
@chepner是的,这似乎是唯一的选择(除了脚本理论上可以像
bash-e-o pipefail script.sh那样运行之外)@chepner添加
成功了,非常感谢!请注意,一些生物信息学库(如Biopython)提供了一些方便的接口来解析Blast结果。它只是切换到for循环。嗨,谢谢你的回复!我没有问题从每一行解析gi,这是通过awk命令完成的,并存储到一个临时文件中,问题在之后的while循环中。我无法重现该问题,但我觉得它与新行和/或临时文件的使用有关。我的建议忽略了这一点。@Rolf我使用您的cut命令删除了中间文件,谢谢。
while read -r i
do
    echo GI:"$i"
    /home/chris/EntrezDirect/edirect/esearch -db protein -query "$i" < /dev/null |
      /home/chris/EntrezDirect/edirect/efetch -format gpc |
      /home/chris/EntrezDirect/edirect/xtract -insd source organism |
      cut -f2 
done < "$input"