2013-05-21 307 views
4

我需要编写一个python脚本,我需要在其中调用一些awk命令。python脚本中的awk命令

#!/usr/bin/python 
import os, sys 
input_dir = '/home/abc/data' 

os.chdir(input_dir) 
#wd=os.getcwd() 
#print wd 
os.system ("tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}'|sort|uniq -c") 

它给在第8行错误:续行符

有没有一种方法可以让我得到awk命令获取到Python脚本中工作后,意外的字符:SyntaxError错误? 感谢

+0

逃脱各地\ t时的报价? –

+2

为什么?没有任何sed/awk/sort/uniq可以做到这一点,您不能直接从python中获得,并且作为奖励,您将得到一个在所有平台上运行的解决方案。 –

回答

7

你有两种类型在该字符串引号的,所以使用三重引号将整个事情

>>> x = '''tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}'|sort|uniq -c''' 
>>> x 
'tail -n+2 ./*/*.tsv|cat|awk \'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}\'|sort|uniq -c' 
+1

堆栈溢出不会在'code'块中正确格式化,但如果您将行粘贴到解释器中,您将会看到我的意思。 – TehTris

6

您应该使用subprocess而不是os.system

import subprocess 
COMMAND = "tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS=\"\t\"};{split($10,arr,\"-\")}{print arr[1]}'|sort|uniq -c" 

subprocess.call(COMMAND, shell=True) 

由于TehTris指出,引号的问题的安排打断的命令字符串分为多个字符串。预格式化命令并转义双引号可修复此问题。

+0

@Schorsch:谢谢:)它的工作原理! – user1189851

+0

在管道中添加更多'| cat'会使它更好,不是吗? – tripleee