2014-09-20 2 views
0

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

runAwk = '''awk '{printf $1}{for(i=2;i<=NF;i++)printf "|"$i}{printf "\n"}' final.txt''' 

os.system(runAwk) 

выдает ошибку:

awk: line 1: runaway string constant " ...

, когда я перемещался из Интернета, я обнаружил, что AWK не может быть использована с модулем зева и там не много содержания. Я смущен, как двигаться дальше.

+0

Возможный дубликат [Что именно делают флаги строки «u» и «r» в Python, и что такое строковые литералы?] (Http://stackoverflow.com/questions/2081640/what-exactly-do- u-and-r-string-flags-do-in-python-and-what-are-raw-string-l) – simonzack

+1

@simonzack, хотя ошибка была вызвана '\ n' обработкой специально Python, это как-то от дублирования. –

+0

@simonzack: как вы могли сказать, что мой пост дублируется? Если я знал, что ошибка была вызвана отсутствием строки «r», у меня не было ответа на этот вопрос. Как вы могли найти решение, если бы вы были новичком и столкнулись с той же проблемой. Пожалуйста, исправьте свое фиктивное заявление. –

ответ

1

\n в вашей runAwk строки интерпретируется Python как буквенный символ новой строки, а не передается через awk как два символа \ и n. Если вы используете raw string вместо этого, предшествовавшие открытию тройные кавычки с r:

runAwk = r'''awk '{printf $1}{for(i=2;i<=NF;i++)printf "|"$i}{printf "\n"}' final.txt''' 

... то Python не будет относиться к \n как означающее «перевод строки», и awk увидите строку, которую вы задумывали.

+0

спасибо за быстрый ответ. Не могли бы вы рассказать об этой концепции «сырой струны», которую вы упомянули здесь. Как это помогает при выполнении awk-скрипта. –

+1

@nancyli: ​​см. [Что именно делают флаги строки «u» и «r» в Python, а также то, что представляют собой строковые литералы?] (Http://stackoverflow.com/q/2081640) –

+0

@ nancyli ссылка предоставлена Martijn стоит прочитать, как и ссылка в моем ответе. Я также немного расширил свой ответ. –