Intereting Posts
Могу ли я сделать резервную копию 1 ТБ диска на 750-Гбайт? ICMP дает хозяину невозможное перенаправление Как отправить электронное письмо самому себе на том же локальном компьютере (порт tcp 25) Как найти имя файлов буфера в vim? Команда для назначения назначенных адресов dhcp Как правильно собрать emacs с помощью pdumper в fedora? Определите, какой процесс занимает большую часть полосы пропускания диска? Исполняемые файлы показывают с символом * рядом с их именем в выводе ls с помощью многоадресной рассылки IPv6 для форматирования файла Каждая служба запускается дважды при загрузке Fedora 25 Добавьте / удалите рабочую станцию ​​ip в / etc / sysconfig / iptables, а затем запустите перезапуск службы iptables Загрузите и установите Report Lab на CentOs Как узнать правильный синтаксис String для моего bash? Установите псевдоним на оболочку Bourne Почему скорость невзаимодействующих процессов, зависящих от памяти, зависит от того, сколько работает (и как исправить)?

Как передать ряд шаблонов в awk из сценария оболочки?

У меня есть серия шаблонов, хранящихся в foo.txt и я хочу foo.txt эти шаблоны и посмотреть, какие строки соответствия в файле bar.txt .

 while read PWW do cat user/dump/bar.txt | awk '/${PWW}/{print $2}' >> user/dump/out.txt done < user/dump/foo.txt 

foo.txt :

 2100001b32 2100001b38 3100001b35 4100001b28 5100001b46 6100001b56 

bar.txt :

 2100001b32 good 2100001b38 bad 3100001b35 okay 4100001b28 large 5100001b46 good 6100001b56 bad 

желаемый out.txt :

 good bad okay large good bad 

Я не могу найти значения в foo.txt . Цикл while работает и дает мне пустой вывод. Думаю, awk ищет ${PWW} (буквально) вместо своих значений из foo.txt .

Как я могу заставить его работать? Моя среда Solaris 5.10, используя оболочку Korn, с базовым awk (старый awk ).

Проверьте свои кавычки. В оболочках unix, включая bash: одинарные кавычки передают текст без изменений в программу (так, как вы сказали, передает ${PWW} , двойные кавычки допускают расширение переменных.

В вашем примере вы хотите ${PWW} , но не $2 , вы можете сделать это следующим образом:

 awk "/${PWW}/"'{print $2}' awk /${PWW}/{print '$2'} awk "/${PWW}/{print \$2}" 

Вот решение pure-awk:

 $ awk 'FNR==NR{a[$1]=$2; next} {print a[$1]}' bar.txt foo.txt good bad okay large good bad 

Как это работает

Сценарий сначала читается в bar.txt и сохраняет его информацию в массиве a . Затем он считывает файл foo.txt и выводит соответствующее значение.

  • FNR==NR{a[$1]=$2; next}

    FNR – это количество строк, считанных из текущего файла, а NR – количество строк, прочитанных до сих пор. Таким образом, если FNR==NR , мы все еще читаем первый файл (bar.txt). Если это так, a[$1]=$2 используется для добавления записи в массив, сохраняющей эти значения. Затем мы пропустим остальные команды в скрипте и начнем с next строки.

  • print a[$1]

    Если мы доберемся здесь, мы читаем второй файл foo.txt. Мы читаем foo.txt по строкам. Для каждой строки мы просматриваем значение, соответствующее ключу в первом столбце, и печатаем его.

Канонический метод передачи строковых значений из оболочки в awk осуществляется через параметр -v var=val .

Если вы хотите использовать эти строки для соответствия шаблону, традиционно с /.../ , вам нужно написать явное совпадение со всей строкой:

 awk -v pattern=${PWW} '$0 ~ pattern {print $2}' 

BTW, для Solaris 10, nawk рекомендуется по сравнению с обычным старым awk , хотя бы для улучшения сообщений об ошибках, чем "bailing out at ..."