#python #shell #awk
#python #оболочка #awk
Вопрос:
большинство существующих решений вызывают awk из python. Но я хочу сделать это наоборот. У меня есть скрипт Python, который извлекает информацию из файла. Однако на указанное имя файла есть ссылка в столбце скрипта awk.
Как мне передать python аргумент «%s20s», filename и получить входные данные из стандартного вывода? я хочу добавить выходные данные в виде еще нескольких столбцов.
спасибо за ваши примеры
Приветствия
Комментарии:
1. Что вы уже пробовали? Какой у вас awk-скрипт? Помогите нам помочь вам! Чем больше деталей, тем лучше!
Ответ №1:
Переменная awk FILENAME указывает имя текущего обрабатываемого файла (или ‘-‘, если stdin). Однако это недоступно в блоке BEGIN, но вместо этого вы можете использовать ARGV[1] (при условии, что вы передаете только одно имя файла):
#!/bin/awk -f
BEGIN {
cmd = "./myscript.py '"%s20s"' " ARGV[1]
print cmd
cmd | getline var
print var
}
Скрипт на python (py3) Я использовал для тестирования был:
#!/usr/bin/python
import sys
print(sys.argv)
Итак, я получаю следующий вывод:
/home/user1> runit.awk afile
./myscript.py "%s20s" afile
['./myscript.py', '"%s20s"', 'afile']
Ответ №2:
Вы можете вызывать внешние команды с помощью system
функции. Решает ли это вашу проблему?
$ awk 'BEGIN { system("echo something") }'
something
Но это предоставляет только код возврата. Если вам нужно захватить стандартный файл, вы можете сделать это:
$ awk 'BEGIN { "echo something" | getline; print "output: "$0 }'
output: something
Getline работает построчно, поэтому, если вам нужно несколько строк:
$ awk 'BEGIN { while ("cat multi_line_file" | getline) { print "output: "$0 } }'
output: line 1
output: line 2
output: line 3