从python执行awk命令

时间:2017-05-31 12:59:32

标签: python linux awk

我正在尝试从python脚本执行以下awk命令

awk 'BEGIN {FS="\t"}; {print $1"\t"$2}' file_a > file_b

为此,我尝试使用subprocess,如下所示:

subprocess.check_output(["awk", 'BEGIN {FS="\t"}; {print $1"\t"$2}',
                         file_a, ">",
                         file_b])

其中file_afile_b是指向文件路径的字符串。

由此,我收到错误

  

awk:无法打开> (没有这样的文件或目录)

我确定我以错误的方式输入subprocess的参数,但我无法弄清楚错误。

1 个答案:

答案 0 :(得分:2)

虽然它可能在您选择的shell中看起来像><|实际上并未作为参数传递给您运行的程序。相反,它们是程序永远不会看到的shell的特殊部分。

由于它们是shell的一部分,而不是操作系统或程序的一部分,因此您必须使用语言为您提供的常规工具自己模拟其效果。在您的情况下,由于您正在尝试管道传输文件,只是像平常一样使用Python的open() subprocess API支持指定stdout,stdin和stderr的参数,您可以为这些提供任何文件对象。

检查出来:

with open(file_b, 'wb') as f:
    subprocess.call(["awk", 'BEGIN {FS="\t"}; {print $1"\t"$2}', file_a], stdout=f)

由于subprocess.check_output已经重定向输出,因此不会使用stdout参数。使用subprocess.call可以避免这种情况。如果您稍后还需要在脚本中输出,则可以将check_output的返回值指定给变量,然后将其保存到file_b

如果你使用了很多shell命令,你可能还想看看Plumbum,这会给你一大堆相当愚蠢的类似shell的运算符重载。