Использовать файл списка для извлечения второго списка из главного файла (и закомментировать некоторые строки)... КАК?

Использовать файл списка для извлечения второго списка из главного файла (и закомментировать некоторые строки)... КАК?

У меня есть два файла: master.tblиsites.lst

Файл master.tblпредставляет собой список сайтов с их конфигурациями портов, именами портов, IP-адресами и т. д. Есть строки, содержащие описания сайтов, комментарии и т. д., но они не имеют значения. Строки, содержащие конфигурации сайтов, организованы следующим образом и разделены пробелами.:

{server} {SITE NAME} {port name} {configuration flags}

Имена портов состоят из имени сайта строчными буквами, тире, буквы «P» и номера порта.

Пример:

server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments

sites.lstсписок сайтов, master.tblна которых мне нужно выполнить поиск в файле.

Мне нужно закомментировать (вставить a #в начале строки) и извлечь имя сервера и имя порта (в файл с именем stoplist.lst) каждой строки, которая соответствует ВСЕМ следующим критериям:

  1. содержит любое имя сайта, перечисленное вsites.lst
  2. содержит "-АДМ"
  3. имеет номер порта больше «2» (пример: hawaii23-P3)

В приведенном выше примере master.tblфайл будет выглядеть так:

server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
#server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments

...и stoplist.lstбудет содержать (предполагая, HAWAII23что находится в sites.lst):

server01 hawaii23-P3

master.lstпочти 300 000 строк, поэтому делать это вручную было бы... плохо.

решение1

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

awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl

Сначала он считывает sites.lstи устанавливает $0"-ADM"(то есть имя сайта + строку -ADM) как индекс массива z. Затем он обрабатывает master.tblизвлечение значения после -Pв 3-м поле как pи, если условия выполнены (2-е поле находится внутри zи pбольше 2), он печатает 1-е и 3-е поля stoplist.lstи комментирует строку.
Обратите внимание, что он не редактирует файл на месте, но вы всегда можете перенаправить на другой файл и перезаписать исходный, если все в порядке (хотя с недавним gnu awkу вас есть возможность -i inplace).

Связанный контент