Как установить встроенную переменную в команде awk для глобальной переменной? - PullRequest
0 голосов
/ 11 января 2019

В настоящее время мой скрипт анализирует файл и ищет определенные шаблоны. Каждый шаблон отличается от другого и является взаимоисключающим в файле. например Если найдено «$ identifier1», то «$ identifier2» и «$ identifier3» не могут быть в файле.

exist=`awk -v v1="$identifer1" -v v2="$identifier2" -v v3="$identifier3" 'BEGIN{FS=":"; OFS="-"} $2 == v1 || $2 == v2 || $2 == v3 {print}' $file`

Вот в чем проблема: во время сравнения ($ 2 == v1 || $ 2 == v2 || $ 2 == v3), как я могу установить $ 2 в качестве глобальной переменной, где я могу использовать ее вне команды awk?

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Может быть, не может напрямую, но если с вами временный ввод-вывод в порядке ...
Вы можете записать $2 во временный файл, а затем прочитать в переменную, например:

exist=`awk -v v1="$identifer1" -v v2="$identifier2" -v v3="$identifier3" 'BEGIN{FS=":"; OFS="-"} $2 == v1 || $2 == v2 || $2 == v3 {print} {printf $2>"_tmpfile_for_v_"}' $file`
tmpv=$(<_tmpfile_for_v_)
rm _tmpfile_for_v_

Теперь вы можете использовать $tmpv сохраненный $2.

Кстати, команда awk может немного улучшиться:

awk -v v1="$identifer1" -v v2="$identifier2" -v v3="$identifier3" 'BEGIN{FS=":"; OFS="-"} {printf $2>"_tmpfile_for_v_"} $2 == v1 || $2 == v2 || $2 == v3 ' $file

Если блок не указан, подразумевается {print}.

0 голосов
/ 13 января 2019

Вы не дали testdata, поэтому я покажу, как вы можете установить дополнительную переменную с упрощенным вопросом.
Предположим, у вас есть файл с одной строкой, начинающейся с 1 (строка типа 1 2 3).
Как вы можете использовать awk для заполнения двух переменных: одна со строкой, начинающейся с 1, и вторая со вторым полем?
Вы можете найти строку с

   line=$(awk '/^1/ {print}' file)

Теперь вы хотели бы сделать что-то вроде

  awk '/1^/ {print "line=" $0; print "field2=" $2}' file

Когда вы знаете, что в строке нет #, вы можете использовать

IFS='#" read -r line field2 <<< $(awk '/^1/ {print $0 "#" $2}' file
0 голосов
/ 11 января 2019

Не могли бы вы попробовать один раз, но ваш вопрос не ясен. Если вы хотите проверить поле, отличное от 2-го, то измените значение переменной с именем field_value, и awk будет искать это конкретное поле.

field_value="2"
exist=$(awk -v v1="$identifer1" -v v2="$identifier2" -v v3="$identifier3" -v field="$field_value" 'BEGIN{FS=":"; OFS="-"} $field == v1 || $field == v2 || $field == v3 {print}' "$file")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...