ввод специальных символов с помощью системы awk в python sys.argv - PullRequest
1 голос
/ 04 февраля 2020

У меня есть сценарий python:

cat tst.py

import sys

x = sys.argv[1]

print(x)
print(type(x))

У меня есть следующий файл

cat input.txt

ID    location    value
ID1   location1   NM_002099.7:c.59C>T
ID2   location2   NM_002099.7:c.71G>A

Я пытаюсь запустить:

awk 'NR>1' | while read -r ID location value; do python3.8 tst.py "$value"; done

Есть ли способ сделать это с помощью awk? ie:

awk 'NR>1 {system("python3 tst.py $3")}'

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Вам нужно указать аргумент для system.

Вы можете сделать это в двойных кавычках:

awk 'NR>1 {system("python3 tst.py \"" $3 "\"")}'

Но двойные кавычки заставят $(echo something) работать как в оболочке. Лучше цитировать его в одинарных кавычках. Поскольку вы не можете сделать ' внутри awk скрипта, очень популярно использовать переменную, установленную в одинарную кавычку, или использовать \x27 это значение ascii внутри awk скрипта:

awk -vq="'" 'NR>1 {system("python3 tst.py " q $3 q)}'

Это будет конечно, потерпит неудачу, если сам аргумент $3 содержит одинарные кавычки. Что вы можете сделать, это написать свою собственную функцию цитирования. Просто замените одиночные кавычки ' на последовательность '\'' и используйте одинарные кавычки, чтобы заключить ее в кавычки, например, abc'def при вводе становится 'abc'\''def' при передаче в оболочку:

awk -vq="'" 'NR>1 {gsub(q, q "\\" q q, $3); system("echo tst.py " q $3 q)}'

В awk все внутри " принимается за строку. Так что awk 'NR>1 {system("python3 tst.py $3")}' попытается запустить буквально python3 tst.py $3. Когда $3 расширяется до 3-го аргумента в оболочке, он расширяется до нуля, и он просто запускает python3 tst.py. Вы хотите объединить строку python3 tst.py с результатом $3 в awk, таким образом system("python3 tst.py " $3).

0 голосов
/ 04 февраля 2020

Другой способ - использовать awk только для обработки текста и передать его на вывод xargs перед вызовом сценария python:

input

ID    location    value
ID1   location1   NM_002099.7:c.59C>T
ID2   location2   NM_002099.7:c.71G>A

Команда

awk 'NR>1{print $3}' input.txt | xargs -L 1 python tst.py

Выход

NM_002099.7:c.59C>T
<type 'str'>
NM_002099.7:c.71G>A
<type 'str'>

Примечания

As Пока в values нет пробела, он должен работать, также обратите внимание, что если в values есть пробелы, они не будут должным образом извлечены awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...