Bash 脚本只循环 运行 一次
Bash script loop only running once
我正在尝试解析一个输入文件(我的测试文件是 4 行),然后查询在线生物数据库。但是我的循环似乎在返回第一个结果后停止了。
#!/bin/bash
if [ "" = "" ]; then
echo "No input file to parse given. Give me a BLAST output file"
else
file=
#Extracts GI from each result and stores it on temp file.
rm -rf /home/chris/TEMP/tempfile.txt
awk -F '|' '{printf("%s\n",);}' "$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
例如,我唯一的输出是
GI:751637161
Pseudomonas stutzeri group
而我应该有 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
编辑:
我无法重现该问题,但我觉得它与换行符有关 and/or 使用临时文件。我的建议省略了这个但没有回答你的实际问题(但我猜你的问题)
似乎 read -r i
在其第二次调用时以非零退出状态返回,表明没有更多数据可从输入文件中读取。这通常意味着 while
循环内的命令是 也 从标准输入读取,并且在 read
有机会之前消耗文件的剩余部分。
这里唯一的候选者是 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"
我正在尝试解析一个输入文件(我的测试文件是 4 行),然后查询在线生物数据库。但是我的循环似乎在返回第一个结果后停止了。
#!/bin/bash
if [ "" = "" ]; then
echo "No input file to parse given. Give me a BLAST output file"
else
file=
#Extracts GI from each result and stores it on temp file.
rm -rf /home/chris/TEMP/tempfile.txt
awk -F '|' '{printf("%s\n",);}' "$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
例如,我唯一的输出是
GI:751637161
Pseudomonas stutzeri group
而我应该有 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
编辑: 我无法重现该问题,但我觉得它与换行符有关 and/or 使用临时文件。我的建议省略了这个但没有回答你的实际问题(但我猜你的问题)
似乎 read -r i
在其第二次调用时以非零退出状态返回,表明没有更多数据可从输入文件中读取。这通常意味着 while
循环内的命令是 也 从标准输入读取,并且在 read
有机会之前消耗文件的剩余部分。
这里唯一的候选者是 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"