Você não quer usar loops de shell para processar texto . Aqui, é um trabalho típico para awk
:
awk -F '"? *, *"?' '
!ports_processed {
port[++ports] = $0; width[ports] = length; next
}
FNR==1 {
printf " | interface Switch\nVLAN-ID | VLAN-NAME "
for (i = 1; i <= ports; i++) printf "|%s", port[i]
print ""
}
{
printf "%6d |%11s", $1, $2
split("", member)
for (i = 3; i <= NF; i++) member[$i]
for (i = 1; i <= ports; i++)
printf "| %*s", 1 - width[i], (port[i] in member ? "*" : " ")
print ""
}' file-1 ports_processed=1 file-2
(aqui assumindo que os nomes de vlan não contenham vírgulas ou aspas duplas ou novas linhas (precisamos saber como eles são codificados se isso ocorrer))
Para responder a questão no assunto, para um shell com suporte à matriz multidimensional, consulte ksh93
. Também possui recursos de análise e gravação de csv.