Передать параметр в файл сценария awk

Вы можете использовать

for i in $(seq $END); do echo $i; done
29
задан Chris Seymour 15 March 2014 в 18:25
поделиться

3 ответа

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

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

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

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

или

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

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

Если вы хотите сделать что-то вроде сценария оболочки, принимающего переменные $ 1 $, вы можете написать небольшой скрипт-оболочку, чтобы обернуть ваши awk-вещи.

РЕДАКТИРОВАТЬ

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

давайте рассмотрим пример:

скажем, у вашего x.awk есть:

{print $1}

, если вы сделаете:

echo "foo" | x.awk file

, то же самое:

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

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

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

awk принимает два ввода (аргументы для awk), один - это stdin, один - файл, в вашем скрипте awk вы можете:

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

это напечатает первым foo из вашего эха, затем column1 из 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" - это второй аргумент, вы можете получить его в своем x.awk по ARGV[2]

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

, теперь это ARGV [4].

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

15
ответ дан Kent 15 March 2014 в 18:25
поделиться

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

Сценарий:

#!/bin/awk -f

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

Демонстрация:

$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV
52
ответ дан Julian Reschke 15 March 2014 в 18:25
поделиться

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

Скажем, у нас есть файл 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
25
ответ дан fedorqui 15 March 2014 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: