我有一个纯文本文件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
*打印语句是任意的,仅用于显示值