Подтвердить что ты не робот

Передайте параметр в файл awk script

Если я хочу передать параметр в файл awk script, как я могу это сделать?

#!/usr/bin/awk -f

{print $1}

Здесь я хочу напечатать первый аргумент, переданный в script из оболочки, например:

bash-prompt> echo "test" | ./myawkscript.awk hello
bash-prompt> hello
4b9b3361

Ответ 1

ваш хэш-бит определяет, что script не является оболочкой script, это awk script. вы не можете сделать это с помощью bash в script.

то, что вы сделали: echo blah|awk ... не, проходящий через paramenter, он передает вывод команды echo другой команде.

вы можете попробовать следующее:

 echo "hello"|./foo.awk file -

или

var="hello"
awk -v a="$var" -f foo.awk file

с этим, у вас есть var a в вашем foo.awk, вы можете использовать его.

если вы хотите сделать что-то вроде shell script принять $1 $2 vars, вы можете написать небольшой shellscript, чтобы обернуть ваш материал awk.

ИЗМЕНИТЬ

Нет, я не понял вас неправильно.

возьмем пример:

скажем, ваш x.awk имеет:

{print $1}

если вы выполните:

echo "foo" | x.awk file

это то же самое, что:

echo "foo"| awk '{print $1}' file

здесь вход для awk - это только file, ваше эхо-foo не имеет смысла. если вы это сделаете:

  echo "foo"|awk '{print $1}' file -
or
    echo "foo"|awk '{print $1}' - file

awk принимает два ввода (аргументы для awk), один из них - stdin one - это файл, в вашем awk script вы могли:

echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file

это выведет первый foo из вашего эха, тогда столбец1 из file, конечно, этот пример не делает никакой фактической работы, просто распечатайте все.

вы можете, конечно, иметь более двух входов и не проверять NR и FNR, вы можете использовать

ARGC   The number of elements in the ARGV array.

ARGV   An array of command line arguments, excluding options and the program argument, numbered from zero to ARGC-1

например:

echo "foo"|./x.awk file1 - file2

то ваш "foo" является вторым аргументом arg, вы можете получить его в x.awk на ARGV[2]

echo "foo" |x.awk file1 file2 file2 -

теперь это случай ARGV [4].

Я имею в виду, что ваш echo "foo"|.. будет stdin для awk, это может быть 1-го или n-го "аргумента" /ввода для awk. зависит от того, где вы помещаете - (stdin). Вы должны обработать его в своем awk script.

Ответ 2

В awk $1 ссылается на первое поле в записи, а не на первый аргумент, как в bash. Для этого вам нужно использовать ARGV, посмотрите здесь для официального слова.

Script:

#!/bin/awk -f

BEGIN{
    print "AWK Script"
    print ARGV[1]
}

Демо:

$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV

Ответ 3

Вы можете использовать -v как параметр командной строки, чтобы предоставить переменную script:

Скажем, у нас есть файл script.awk:

BEGIN {print "I got the var:", my_var}

Затем мы запускаем его следующим образом:

$ awk -v my_var="hello this is me" -f script.awk
I got the var: hello this is me