如何将 AWK 命令输出作为第一个参数传送到 Python

如何将 AWK 命令输出作为第一个参数传送到 Python

我有一个纯文本文件input.txt,如下所示:

D000001 D000001 44 1975
D000001 D000408 1 1983
D000001 D000641 1 1977
D000001 D000900 27 1975

我使用这个简单的 AWK 行来处理这个文件:

awk '{if ($4 == 1975) print $1,$2,$3}' input.txt

然后我有一个 Python 脚本,它接受一个文件作为第一个命令行参数:

#!/usr/bin/env python3

import sys

file_name = sys.argv[1]
print(file_name)

我想知道是否可以将 AWK 输出作为文件参数传送到 Python 程序以及如何做到这一点?

答案1

如果你想使用管道,那么您的 python 脚本必须从 stdin 读取。您的脚本没有这样做。相反,它需要命令行上的文件名。这可以使用名为流程替代将两者连接在一起:

script.py <(awk '{if ($4 == 1975) print $1,$2,$3}' input.txt)

<(...)表示进程替换。这里发生的事情是 shell 创建一个包含 awk 命令输出的类文件对象。这个类文件对象甚至有一个名称。如果运行该脚本,输出将看到它的名称,传递给 python 为sys.argv[1],如下所示:

/dev/fd/63

答案2

这是一个老问题,但是如果你在 bash 上,并且你的脚本中有类似的东西

import sys
x = sys.argv[1]
print x

并且你想通过管道将命令输出到脚本中,而不是将其放入脚本中,那么你可以这样做

test.py $(some_command -w arguments)

如果您期望输出单个字符串,它将作为 argv[1] 传回。如果您期望多个字符串,它们将被单独传入并放入 argv[] 数组中,如果您想检查内容,您可以这样做

print argv[1:] #starting at index 1 so you don't get the script name in the output

如果它是以数组形式返回的输出类型,则必须修改 Python 脚本以将所有输出放入一个可调用对象中。 接受的答案中有方法,但您也可以直接在脚本中调用命令,并使用以下命令将输出保存到变量中

import subprocess
x = subprocess.check_output("awk '{if ($4 == 1975) print $1,$2,$3}' ./test.txt",shell=True)
print x

输出

D000001 D000001 44
D000001 D000900 27

*打印语句是任意的,仅用于显示值

相关内容