Цикл Bash while, вызывающий скрипт Python - PullRequest
2 голосов
/ 02 марта 2010

Я хотел бы вызвать скрипт Python из цикла Bash while. Однако я не очень хорошо понимаю, как правильно использовать синтаксис цикла цикла (и, возможно, переменной) Bash. Я ищу такое поведение: файл все еще содержит строки (последовательности ДНК), но я вызываю скрипт Python для извлечения групп последовательностей, чтобы другая программа (dialign2) могла их выровнять. Наконец, я добавляю выравнивания в файл результатов. Примечание: я не пытаюсь перебрать файл. Что я должен изменить, чтобы цикл Bash while работал? Я также хочу быть уверен, что цикл while будет перепроверять изменяющийся файл file.txt в каждом цикле. Вот моя попытка:

#!/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

Спасибо! * * 1004

Ответы [ 4 ]

3 голосов
/ 02 марта 2010

Понятия не имею, почему вы хотите это сделать.

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
1 голос
/ 02 марта 2010

попробуйте -gt, чтобы исключить метасимвол оболочки >

while [ `wc -l  file.txt`  -gt 0 ]
do
    ...
    c=$[c + 1]
done
0 голосов
/ 02 марта 2010

@ OP, если вы хотите перебрать файл, просто используйте цикл чтения. Кроме того, вы используете не переменную $ c, а строку. Вы передаете каждую строку вашему скрипту Python? Или вы просто вызываете свой скрипт Python всякий раз, когда встречается строка? (ваш сценарий будет медленным, если вы это сделаете)

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  

Наконец, вы могли бы сделать все на Python. способ итерации "file.txt" в Python просто

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()
0 голосов
/ 02 марта 2010

Следующее должно делать то, что вы говорите, что хотите:

#!/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

Однако, нет необходимости использовать bash для перебора строк в файле. Вы можете сделать это довольно легко, даже не выходя из python:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...