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