3

У меня есть простой текстовый файл 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 в качестве аргумента файла и как это сделать?

2 ответа2

3

Если вы хотите использовать канал, тогда ваш скрипт на python должен будет читать из stdin. Ваш сценарий не делает этого. Вместо этого он ожидает имя файла в командной строке. Это может быть выполнено с помощью функции оболочки, называемой подстановкой процесса, для соединения этих двух компонентов:

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

<(...) обозначает подстановку процесса. Здесь происходит то, что оболочка создает файлоподобный объект, который содержит выходные данные команды awk. Этот файлоподобный объект даже имеет имя. Если вы запустите скрипт, вывод увидит его имя, переданное в python как sys.argv[1] , что-то вроде:

/dev/fd/63
0

Это старый вопрос, но если вы на 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

* операторы печати произвольны и просто выбраны, чтобы показать значения

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .