3

Pythonからawkコマンドラインスクリプトを呼び出したいと思いました。

os.system('''awk 'BEGIN{FS="\t";OFS="\n"} {a[$1]=a[$1] OFS $2 FS $3 FS $4} END{for (i in a) {print i a[i]}}' 2_lcsorted.txt > 2_locus_2.txt''')

次のエラーが発生します。

awk: cmd. line:1: BEGIN{FS="    ";OFS="
awk: cmd. line:1:                     ^ unterminated string
awk: cmd. line:1: BEGIN{FS="    ";OFS="
awk: cmd. line:1:                     ^ syntax error
256

subprocess.callを使用してサブプロセスを使用すると、別の種類のエラーが発生します。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib64/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

シェルで正常に実行され、私がやりたいのは、すべてのステップを1つのPythonスクリプトに結合することだけです。いくつかの明らかな理由から、特定の処理ステップにはawkの方が適しています。誰かがこれらのエラーの原因を教えてもらえますか?

4

2 に答える 2

1

文字列をにフィードする前に、 Pythonが\n改行文字(または\tタブ)に変換されないようにする必要がありますsystemr"""...."""jwpat7が提案するように使用します。別の可能性は、文字列のようなものを書くことです... OFS="\\n" ...

于 2013-03-07T19:34:40.170 に答える
0

追加するだけで、PyAwkを使用した方がよい場合があります。pyawk.sourceforge.netまた、サブプロセスを使用している場合、問題はコマンドを分割する必要があることです。サブプロセスの動作はos.systemとは少し異なります。subproccesでは、cmdがリストではなく文字列である必要があります。例えば、

`os.system('''awk 'BEGIN {FS="\t";OFS="\n"} {a[$1]=a[$1] OFS $2 FS $3 FS $4} 
END {for (i in a) {print i a[i]}}' 2_lcsorted.txt > 2_locus_2.txt''')`

してはいけない

`subprocess.call('''awk 'BEGIN {FS="\t";OFS="\n"} {a[$1]=a[$1] OFS $2 FS $3 FS $4} 
END {for (i in a) {print i a[i]}}' 2_lcsorted.txt > 2_locus_2.txt''')`

それはうまくいきません。サブプロセスに文字列をフィードすると、それが実行するコマンドへのパスであると見なされます。コマンドはリストである必要があります。www.gossamer-threads.com/lists/python/python/724330をチェックしてください。また、ファイルリダイレクトを使用しているため、次を使用する必要があります

`subprocess.call(cmd, shell=True)`
于 2013-03-07T20:31:03.487 に答える