2013-03-07 175 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" ...的內容。