2013-03-07 138 views
2

调用AWK我想从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罚款和所有我想要做的是所有步骤结合在一个单一的蟒蛇小号cript,并且由于某些明显的原因,awk对于某些处理步骤更好。有人可以向我解释这些错误的原因吗?

+1

它在'''之前用'r'做什么? (即'r'''awk'BEGIN {FS =“\ t”; OFS =“\ n”} {...'('\ n'被解释得太早了一步) – 2013-03-07 19:32:43

+0

你究竟在干什么试图完成?我可以看到'awk'运行一个预先写好的'awk'脚本,但是为什么用一个硬编码的脚本调用awk,当你可以在Python中做同样的事情时呢? – chepner 2013-03-07 19:38:57

+0

@chepner ..我首选awk,因为我不知道python是否可以在流输入上工作..它只是我相信解析在awk中更快 – WYSIWYG 2013-03-08 12:41:00

回答

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''')` 

Shoudn't是

`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)` 
1

你不想Python的字符串喂养system\n转换为换行符(或\t制表)。按照jwpat7的建议使用r"""...."""。另一种可能性是在字符串中写入类似... OFS="\\n" ...的内容。