Use um arquivo de lista para extrair uma segunda lista de um arquivo mestre (e comente algumas linhas)...COMO?

Use um arquivo de lista para extrair uma segunda lista de um arquivo mestre (e comente algumas linhas)...COMO?

Eu tenho dois arquivos: master.tblesites.lst

O arquivo master.tblé uma lista de sites, com suas configurações de portas, nomes de portas, endereços IP, etc. Existem linhas contendo descrições de sites, comentários, etc., mas são irrelevantes. As linhas contendo as configurações do local estão dispostas desta forma e são delimitadas por espaços.:

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

Os nomes das portas consistem no nome do site em letras minúsculas, um travessão, um "P" e o número da porta.

Exemplo:

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é uma lista de sites que preciso pesquisar no master.tblarquivo.

Preciso comentar (inserir a #no início da linha) e extrair o nome do servidor e o nome da porta (em um arquivo chamado stoplist.lst) de cada linha que atenda a TODOS os seguintes critérios:

  1. contém qualquer nome de site listado emsites.lst
  2. contém "-ADM "
  3. tem um número de porta maior que '2' (exemplo hawaii23-P3:)

No exemplo acima, o master.tblarquivo ficaria assim:

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

...e stoplist.lstconteria (supondo que HAWAII23esteja em sites.lst):

server01 hawaii23-P3

master.lsttem quase 300.000 linhas, então fazer isso manualmente seria...ruim.

Responder1

Aqui está uma awksolução:

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

Isso lê sites.lstprimeiro e define $0"-ADM"(que é o nome do site + a string -ADM) como um índice do array z. Em seguida, ele processa master.tbla extração do valor após -Po 3º campo como pe, se as condições forem atendidas (o 2º campo está dentro ze pé maior que 2), ele imprime o 1º e o 3º campos stoplist.lste comenta a linha.
Observe que ele não edita o arquivo no local, mas você sempre pode redirecionar para outro arquivo e substituir o original se tudo estiver OK (embora com um arquivo recente gnu awkvocê tenha a opção -i inplace).

informação relacionada