Вызов скрипта python из awk

#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