Q1
Este comando awk extrai uma lista ordenada de nomes de computadores exclusivos do arquivo, assumindo:
O arquivo de origem é muito mais longo, tendo um bloco de linhas para cada switch.
Um script para obter um bloco de comutação inteiro (supondo que a linha de comutação é sempre a primeira linha de um conjunto contínuo de linhas para cada comutador) classificado e removendo nós repetidos é:
awk -v FS='[#"]' '
BEGIN{c=0}
$1~/Switch/ {c++; j=0; split($5,arr,"[;:]" ); sw[c,0]=arr[2] }
$1~/\[[0-9]+\]/ { j++; split($5,arr," " ); sw[c,j]=arr[1] }
END {
print("final count of switches=" c)
for (i=1; i<=c; i++) {
print( "switch=" i, sw[i,0] ) # show switch number.
split("", out , ":" ) # delete array "out".
split("", indices , ":" ) # delete array "indices".
j=0
while (sw[i,++j]) { # for all array elements.
if (out[sw[i,j]]++ < 1) { # Is it a new value?
indices[sw[i,j]]=j # add to array "indices".
}
}
n=asorti(indices) # sort the keys of indices
printf( "%s ", sw[i,0] )
for (k=1; k<=n; k++) { # all values for a switch.
printf( "%s ", indices[k] )
}
printf( "%s\n", "" )
}
}
' infile
Resultados:
final count of switches=3
switch=1 ibsw20
ibsw20 Infiniscale-IV compute060 compute061 compute062 compute063
compute064 compute065 compute066 compute067 compute068 compute069
compute070 compute071 compute072 compute073 compute074 compute075
compute076 compute077
switch=2 ibsw21
ibsw21 Infiniscale-IV compute060 compute061 compute062 compute063
compute064 compute065 compute066 compute067 compute068 compute069
compute070 compute071 compute072 compute073 compute074 compute075
compute076 compute077
switch=3 ibsw22
ibsw22 Infiniscale-IV compute060 compute062 compute063 compute074
compute076
Não tenho certeza se o Infiniscale-IV deve ser removido e se você também está solicitando o processamento adicional necessário para obter:
SwitchName=ibsw20 Nodes=compute[060-077]
Q2
Do "homem awk":
If RS is set to the null string, then records are separated by blank lines.
Esse é o "separador de registro" (RS) definido como null:
awk -v RS='' 'script to process lines' file