python 带有 -F 选项的子进程 awk 和使用输入文件的变量

python subprocess awk with -F option and using variable for input file

我有一个文本文件,其中的数据以“|”分隔

例如

123 | 456 | 789

我只想打印第二列。 我可以像这样在 shell 中使用 awk:awk -F'|' '{打印 $2}' file.txt

但是,我想使用 python 子流程来完成此操作。而且输入文件必须是一个变量。

现在,这就是我所拥有的。

import subprocess

file = "file-03-10-2016.txt"

with open('another_file.txt', 'wb') as output:
var = subprocess.check_call(['awk', '{print }', file])
print var

这会打印第二列,但它使用 space 作为分隔符。我想将分隔符更改为“|”使用 awk 的 -F 选项。

subprocess.check_call 获取由 space 个字符连接并传递给 shell 的字符串列表。所以你可以只添加 -F'|' 参数作为列表中的一个项目。唯一的问题是列表使用单引号。如果你想保持一致,你需要在你的参数中转义单引号:

var = subprocess.check_call(['awk', '-F\'|\'', '{print }', file])

或者,python 也接受双引号作为字符串分隔符:

var = subprocess.check_call(['awk', "-F'|'", '{print }', file])

希望对您有所帮助。

尝试:

var = subprocess.check_call(['awk', '-F|', '{print }', file])

但是,我觉得我应该指出这个任务在纯 python:

中很容易完成
def awk_split(file_name, column, fs=None):
    with open(file_name, 'r') as file_stream:
        for line in file_stream:
            yield line.split(fs)[column]

for val in awk_split(file, 1, fs='|'):
    # do something...