команда awk в python с переменными - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующая команда для перехода в скрипт Python.

awk '/^>/{n=split($0,a,"_")} /string/{sum+=a[n]} END{print sum}' filein.fasta

Что бы я ни пытался Это делает беспорядок (os.system, popen, subprocess.call ...) моя последняя попытка:

string = this variable is a string like "acgactactgtcagtgctgac" provided in a loop     
filein = open("filein.fasta")
with open('fileout.txt', 'a+') as outputd:
        subprocess.call(['awk', '\'/^>/{n=split($0,a,"_")}', '/' + line + '/{sum+=a[n]}', 'END{print sum}\'', filein], stdout=outputd, shell=True)    

таким образом, у меня естьна данный момент нет ошибок, но это не работает должным образом, потому что это вызывает ошибку после в сценарии. Как я могу правильно передать эту команду в Python? Кавычки являются больной темой в этой ситуации

1 Ответ

1 голос
/ 06 ноября 2019

Пожалуйста, избегайте использования awk команд в python скриптах.

Мне действительно нравится awk, но python может легко сделать то, что может awk.

awk '/^>/{n=split($0,a,"_")} /string/{sum+=a[n]} END{print sum}' filein.fasta

делает

Для каждой строки, которая содержит > в начале, она разделяется с помощью разделителя _. Он продолжает анализ и, когда / string / найден, добавляет последнее поле разделенной строки в переменную sum.

Использование python:

sum = 0
with open("filein.fasta") as input:
    for line in input:
        if line[0] == '>':
            fields = line.split('_')
        if (string in line) and fields:
            sum += int(fields[-1]) # or float
print(sum)

Вызов подпроцессасделать ваш код менее переносимым и трудным для отладки или мониторинга.

Кстати, скрипт awk не годится, он должен быть:

awk '/^>/{n=split($0,a,"_")} /string/&&n{sum+=a[n]} END{print sum}' filein.fasta
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...