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

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

#!/usr/bin/awk -f

{print $1}

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

bash-prompt> echo "test" | ./myawkscript.awk hello
bash-prompt> hello
30
задан 16.05.2020, 10:32

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
ответ дан 16.05.2020, 10:33
  • 1
    Я раньше чувствовал то же самое по отношению к jQuery. Тогда однажды это нажало и я haven' t оглянулся назад. До свидания document.getElementById()! – Jeff B 04.11.2019, 15:49
  • 2
    У Вас есть недоразумение, Вы понимаете, что вздор эха | awk... означает, что я передаю параметр awk сценарию. Читайте снова. – Mahmoud Emam 16.05.2020, 10:34
  • 3
    хороший комментарий upvoted:).. @UNIX видят редактирование, я надеюсь, что оно очищено теперь. – Kent 16.05.2020, 10:34
  • 4
    @UNIX вскоре, если Вы хотите, чтобы Ваш echo foo|./x.awk file распечатал foo первый, делают echo foo|./x.awk - file – Kent 16.05.2020, 10:34
  • 5
    Благодарен за то, что @Kent помогает – Mahmoud Emam 16.05.2020, 10:35
  • 6
    Возвратился к этому ответу (я favorited вопрос сделать так). Я не могу сделать чего-то как awk {print 1}. Это означает что awk всегда потребности или awk <commands> file или something | awk <commands>? – fedorqui 16.05.2020, 10:36

В 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
54
ответ дан 16.05.2020, 10:32
  • 1
    @Jeff я думаю I' m только на остром выступе того переключателя. На днях я работал над этой сложной вещью навигации - захватывающие ссылки, изменяя стили, эффекты, и т.д. Крайний срок вырисовывался, таким образом, я просто сказал, " Завинтите его, " и переключенный на jQuery. Мне потребовались десять минут и 20 строк - 20 строк! - чтобы сделать все это. Это не могло бы иметь " нажатый, " но it' s только вопрос времени. – sdleihssirhc 04.11.2019, 15:49

Вы можете использовать -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
ответ дан 16.05.2020, 10:33
  • 1
    О, спасибо, I' ll помнят что особенно итератор part^_^ – Archeosudoerus 10.12.2019, 23:23

Теги

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