Use un file de list para extraer una segunda list de un file maestro (y comente algunas líneas) … ¿CÓMO?

Tengo dos files: master.tbl y sites.lst

El file master.tbl es una list 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 organizadas de este modo, y están delimitadas por espacios .:

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

Los nombres de los puertos consisten en el 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.lst es una list de sitios para los que necesito search el file master.tbl .

Necesito comentar (inserte un # al principio de la línea) y extraer el nombre del server y el nombre del puerto (en un file llamado stoplist.lst ) de cada línea que cumple TODOS los siguientes criterios:

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

En el ejemplo anterior, el file master.tbl 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.lst contendría (suponiendo que HAWAII23 está en sites.lst ):

 server01 hawaii23-P3 

master.lst es casi 300,000 líneas, por lo que hacerlo manualmente sería … malo.

Aquí hay una solución 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 

Esto lee sites.lst primero y establece $0"-ADM" (que es el nombre del sitio + la cadena -ADM ) como un índice de la matriz z . Luego procesa master.tbl extrayendo el valor después de -P en el tercer campo como p y, si se cumplen las condiciones (el segundo campo está en z y p mayor que 2) imprime los campos primero y tercero en stoplist.lst y comenta el Fuera de la linea.
Tenga en count que no edita el file in situ, pero siempre puede networkingireccionarlo a otro file y sobrescribir el original si todo está bien (aunque con un reciente gnu awk tiene la opción -i inplace ).