从python调用awk

时间:2013-03-07 19:29:59

标签: python awk subprocess

我想从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对于某些处理步骤更好。有人可以解释一下这些错误的原因吗?

2 个答案:

答案 0 :(得分:1)

在将字符串提供给\n之前,您不希望Python将\t转换为换行符(或system转换为制表符)。建议使用r"""...."""作为jwpat7。另一种可能性是在字符串中写出类似... OFS="\\n" ...的内容。

答案 1 :(得分:0)

添加,你可能最好使用PyAwk:pyawk.sourceforge.net 此外,如果您正在使用子进程,则问题是您的命令应该被拆分。请参阅,子进程的工作方式与os.system略有不同。子过程要求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)`