Можно ли использовать переменную вместо файла с помощью команды gnu awk? - PullRequest
2 голосов
/ 20 октября 2019

Я новичок в написании сценариев оболочки. Я читал сценарий и не понимаю функции, использующей команду gawk.

  awk_egrep () {
  local pattern_string=$1

  gawk '{
    while ($0) {
      start=match($0, pattern);
      token=substr($0, start, RLENGTH);
      print token;
      $0=substr($0, start+RLENGTH);
    }
  }' pattern="$pattern_string"
}

когда я начинаю читать руководство по GNU awk, написано, что еслиПрограмма короткая, ее проще всего включить в команду, которая запускает awk, например: awk 'program' input-file1 input-file2 ...

мой вопрос: когда автор пишет pattern = "$ pattern_string "он использует переменную вместо файла? при поиске я обнаружил, что для использования переменной мы можем использовать канал вроде этого echo "$ var1" |AWK.

Ответы [ 3 ]

1 голос
/ 20 октября 2019

pattern="$pattern_string" объявляет переменную awk pattern с содержимым из переменной bash pattern_string (здесь с $1). awk читает здесь из стандартного ввода, а не из файла.

Вместо

gawk '...' pattern="$pattern_string"

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

gawk -v pattern="$pattern_string" '...'
1 голос
/ 20 октября 2019

Со страницы руководства awk:

  If  a  filename on the command line has the form var=val it is treated as a variable assignment.  The variable var will be
   assigned the value val.  (This happens after any BEGIN rule(s) have been run.)  Command line variable assignment  is  most
   useful  for dynamically assigning values to the variables AWK uses to control how input is broken into fields and records.
   It is also useful for controlling state if multiple passes are needed over a single data file.

Таким образом, это создаст шаблон переменной AWK, установленный в значение переменной SHELL 'pattern_string' (в данном случае,первый аргумент функции 'awk_egrep'. В коде видно, что скрипт AWK использует переменную 'pattern'.

В этом случае это эквивалентно шаблону 'awk -v "= $pattern_string "

EDIT

Стоит отметить, что хотя -v будет устанавливать переменные в блоке 'BEGIN', аргумент var = val будет устанавливать переменнуюнепосредственно перед обработкой следующего аргумента файла. Это может использоваться для поддержки многопроходной обработки или различных стадий обработки. Например,

awk '{ print v, $0 }' v=1 infile v=2 infile

приведет к тому, что процесс запустится дважды, первый раз с v = 1, ивторой раз с v = 2.

1 голос
/ 20 октября 2019

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

 awk_egrep "some_argument"

Теперь перейдем к вашему вопросу о том, почему используется pattern="$pattern_string",на самом деле мы могли бы использовать непосредственно как:

awk '
...........your awk code.....
' "$pattern_string"

Это выше должно быть достаточно хорошо, чтобы заставить вашу функцию работать, почему переменная используется, вы можете видеть, так как функция ожидает, что ей будет передан аргумент при вызове ида, это переменная для awk.

Еще одна вещь выглядит так, как будто OP не передал полный код, поэтому есть вероятность, что awk читает данные из стандартного ввода, а не из Input_file.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...