Utilice un archivo de lista para extraer una segunda lista de un archivo maestro (y comente algunas líneas)... ¿CÓMO?

Utilice un archivo de lista para extraer una segunda lista de un archivo maestro (y comente algunas líneas)... ¿CÓMO?

Tengo dos archivos: master.tblysites.lst

El archivo master.tbles una lista de sitios, con sus configuraciones de puertos, nombres de puertos, direcciones IP, etc. Hay líneas que contienen descripciones de sitios, comentarios, etc., pero son irrelevantes. Las líneas que contienen las configuraciones del sitio están ordenadas de la siguiente manera y delimitadas por espacios:

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

Los nombres de los puertos constan del nombre del sitio en minúsculas, un guión, una "P" y el número de puerto.

Ejemplo:

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.lstHay una lista de sitios en los que necesito buscar el master.tblarchivo.

Necesito comentar (insertar a #al principio de la línea) y extraer el nombre del servidor y el nombre del puerto (en un archivo llamado stoplist.lst) de cada línea que cumpla TODOS los siguientes criterios:

  1. contiene cualquier nombre de sitio listado ensites.lst
  2. contiene "-ADM"
  3. tiene un número de puerto superior a '2' (ejemplo: hawaii23-P3)

En el ejemplo anterior, el master.tblarchivo se vería así:

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

...y stoplist.lstcontendría (suponiendo HAWAII23que esté en sites.lst):

server01 hawaii23-P3

master.lstTiene casi 300.000 líneas, por lo que hacer esto manualmente sería... malo.

Respuesta1

Aquí tienes una awksolución:

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

Esto se lee sites.lstprimero y se establece $0"-ADM"(es decir, el nombre del sitio + la cadena -ADM) como índice de la matriz z. Luego procesa master.tblla extracción del valor posterior -Pen el tercer campo py, si se cumplen las condiciones (el segundo campo está dentro zy pes mayor que 2), imprime el primer y tercer campo stoplist.lsty comenta la línea.
Tenga en cuenta que no edita el archivo en el lugar, pero siempre puede redirigir a otro archivo y sobrescribir el original si todo está bien (aunque con uno reciente gnu awktiene la opción -i inplace).

información relacionada