Bash while循环调用Python脚本
我想在Bash while循环中调用Python脚本。但是,我不太了解如何恰当地使用Bash的while循环(可能还有变量)语法。我正在寻找的行为是,当文件仍然包含行(DNA序列)时,我调用Python脚本来提取序列组,以便另一个程序(dialign2)可以对齐它们。最后,我将路线添加到结果文件中。注意:我并没有试图迭代该文件。为了使Bash-while循环工作,我应该更改什么?我还想确保while循环将重新检查每个循环上不断变化的file.txt文件。以下是我的尝试:Bash while循环调用Python脚本,python,bash,while-loop,Python,Bash,While Loop,我想在Bash while循环中调用Python脚本。但是,我不太了解如何恰当地使用Bash的while循环(可能还有变量)语法。我正在寻找的行为是,当文件仍然包含行(DNA序列)时,我调用Python脚本来提取序列组,以便另一个程序(dialign2)可以对齐它们。最后,我将路线添加到结果文件中。注意:我并没有试图迭代该文件。为了使Bash-while循环工作,我应该更改什么?我还想确保while循环将重新检查每个循环上不断变化的file.txt文件。以下是我的尝试: #!/bin/bash
#!/bin/bash
# Call a python script as many times as needed to treat a text file
c=1
while [ `wc -l file.txt` > 0 ] ; # Stop when file.txt has no more lines
do
echo "Python script called $c times"
python script.py # Uses file.txt and removes lines from it
# The Python script also returns a temp.txt file containing DNA sequences
c=$c + 1
dialign -f temp.txt # aligns DNA sequences
cat temp.fa >>results.txt # append DNA alignements to result file
done
谢谢 尝试
-gt
删除shell元字符>
while [ `wc -l file.txt` -gt 0 ]
do
...
c=$[c + 1]
done
不知道你为什么要这么做
c=1
while [[ -s file.txt ]] ; # Stop when file.txt has no more lines
do
echo "Python script called $c times"
python script.py # Uses file.txt and removes lines from it
c=$(($c + 1))
done
以下内容应满足您的要求:
#!/bin/bash
c=1
while read line;
do
echo "Python script called $c times"
# $line contains a line of text from file.txt
python script.py
c=$((c + 1))
done < file.txt
@OP如果您想循环文件,只需使用whileread循环即可。此外,您没有使用变量$c以及行。是否将每一行都传递给Python脚本?或者只要遇到一行代码就调用Python脚本?(如果你这样做,你的脚本会变慢)
您可能需要更清楚地了解目前不起作用的内容…
wc-l file.txt
将返回类似于100 file.txt
,如果您确实想使用wc,则需要提取数字。例如,wc-l file.txt | cut-f1-d''
为什么不从Python脚本调用Python?原因是我需要使用另外两个程序,dialign2(对齐DNA序列)和cat(将对齐结果附加到结果文件)。我不习惯用Python和bash来称呼这些,因为它们似乎是一个自然的选择。另外,我正在学习一些bash编程,我想把它们放在一个小脚本的上下文中。你的代码(非常奇怪,顺便说一句)给我们提供了一些关于你实际想做什么的信息。您可以粘贴一个数据示例(输入和输出)。-s file
如果该文件存在且大小大于零,则为True。您只需注意python脚本不会留下任何尾随换行符或其他内容。关于此问题,有很多问题会提醒您注意。我很难想象为什么一个没有参数的python脚本需要被bash多次调用。谢谢,这对我来说完全是个窍门。我想这样做的原因(如果你看到更好的方法,建议另一种方法)是使用程序“dialign2”递归地对齐DNA序列,同时选择每次与Python脚本对齐的序列,并从输入文本文件(fasta格式)中删除这些序列以进行另一次传递。选择要对齐的序列是基于名称的一部分,我觉得在Python中这样做很舒服。再次感谢!我在代码中添加了详细信息,以进一步说明我正在尝试做什么。不需要cat with while loopHi,我不只是尝试迭代一个文件的行,而是在每个过程中创建另一个临时文件供另一个程序使用,直到原始文件为空。我补充了问题的细节。Cheers@ghostdog74:是的。但如果您在读取xwhile(())
中使用
进行这样的整数比较:while($(wc-l0))
(我从ghostdog74学到了使用wc
进行重定向,它消除了文件名并只返回计数。)你不需要扫描整个文件来知道它是否是空的-s
当然会工作,因为(只是为了好玩)grep-lv'^*$'file.txt>/dev/null
会检测(并在之后停止)第一个非空行——对于一个有一个或多个非空行的文件,状态为1,对于所有其他情况(包括空/零字节文件),状态为0,谢谢,但我不尝试循环浏览文件。我在原来的问题上增加了细节。是的。您正在file.txt上使用wc-l和while循环,这意味着您正在迭代一个文件。唯一的区别是您是否要使用迭代的line变量。我只是尝试使用文件的一个特征(即文件中仍然包含信息)作为继续在其上使用Python脚本的标准。我猜“wc”函数正在迭代文件。这就是你的意思吗?是的,这就是我的意思。因为您正在检查行数
myfile = open('file.txt', 'r')
for count, line in enumerate(myfile):
print '%i lines in file' % (count + 1,)
# the variable "line" contains the line of text from the file.txt
# Do your thing here.
while true
do
while read -r line
do
# if you are taking STDIN in myscript.py, then something must be passed to
# myscript.py, if not i really don't understand what you are doing.
echo "$line" | python myscript.py > temp.txt
dialign -f temp.txt # aligns DNA sequences
cat temp.txt >>results.txt
done <"file.txt"
if [ ! -s "file.txt" ]; break ;fi
done
f=open("file.txt"):
for line in f:
print "do something with line"
print "or bring what you have in myscript.py here"
f.close()