如何通过Python代码执行awk命令

6
我有一组需要处理的数据。我尝试运行一个Python代码来在Linux中执行“awk”命令,但无论我尝试不同的参数或函数,都无法成功。
有两种不同的方法我尝试过,但它们都没有起作用。我不知道为什么。
1)
#!/usr/bin/env python
import subprocess as sp
cmd = "awk, '{print $2 '\t' $4 '\t' $5 '\t' $6}', B3LYPD.txt"
args = cmd.split(',')
p = sp.Popen(args, stdin = sp.PIPE, stdout = sp.PIPE, stderr = sp.PIPE )

2)

#!/usr/bin/env python
import subprocess as sp
cmd = "awk, '{print $2 '\t' $4 '\t' $5 '\t' $6}'"
args = cmd.split(',')
p = sp.Popen(args, stdin = sp.PIPE, stdout = sp.PIPE, stderr = sp.PIPE )
c = p.communicate('B3LYPD.txt')
print c

1
使用 shlex.split 而不是 str.split - Ashwini Chaudhary
7
如果你已经在使用Python编程,你确定需要调用awk吗?Python很可能可以很好地完成你需要从awk中实现的所有功能。 - Lev Levitsky
如果您需要一个字符串列表,而不是使用 c = "this, that, other" ; args = cmd.split(','),您可以直接使用 args = ["this", "that", "other"] 并跳过分割命令。 - Mark R. Wilkins
此外,Lev的评论是正确的,如果你的代码在这里代表了你实际的awk模式,那么你应该能够逐行读取文本文件并使用split()函数来挑选列。 - Mark R. Wilkins
2个回答

6

虽然我同意这最好用Python来完成,而不是调用awk。如果你真的需要这样做,那么实际上问题出在你的awk上。

#!/usr/bin/env python
import subprocess as sp
args = ["awk", r'{OFS="\t"; print $2,$4,$5,$6}', "B3LYPD.txt"]
p = sp.Popen(args, stdin = sp.PIPE, stdout = sp.PIPE, stderr = sp.PIPE )
print(p.stdout.readline()) # will give you the first line of the awk output

编辑:修复了缺失的引号。


2

你可以使用三引号定义命令,然后在 subprocess 中加上 shell=True

#!/usr/bin/env python
import subprocess as sp
cmd = """awk '{print $2"\t"$4"\t"$5"\t"$6}' B3LYPD.txt"""
p = sp.Popen(cmd, stdin=sp.PIPE, stdout = sp.PIPE, stderr = sp.PIPE,shell=True)
for l in p.stdout:
        print (l.decode())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接