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

它在 shell 中运行良好,我要做的就是将所有步骤组合在一个 python 脚本中,并且由于某些明显的原因,awk 对于某些处理步骤更好。有人可以解释一下这些错误的原因吗?

4

2 回答 2

1

您不希望 Python 在将\n字符串\t提供给system. r"""...."""按照 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''')`

那是行不通的。如果您为 subprocess 提供一个字符串,它假定这是您要执行的命令的路径。该命令需要是一个列表。查看 www.gossamer-threads.com/lists/python/python/724330。另外,因为您使用的是文件重定向,所以您应该使用

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