Como filtrar uma matriz de strings no ksh

2

Por favor, informe o que está errado no meu código ksh. Desejo remover os IPs como definidos no array "bb" do array "aa", para que os 255.0.0.0 e 255.255.255.0 do IP sejam removidos da lista em < matriz strong> aa .

Quando executo meu código ksh e depois imprimo a matriz aa, vejo que o IP - 255.255.255.0 não foi excluído?

Por favor, informe o que está errado na minha sintaxe?

   echo ${aa[*]}
   45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12


   echo ${bb[*]}
   255.0.0.0 255.255.255.0

programa do ksh:

  for run in  ${bb[*]}
  do
   for ((i=0; i<${#aa[@]}; i++)); do
   [[ ${aa[i]} == $run ]] && unset aa[i]
   done
  done

teste:

 echo ${aa[*]}
   45.32.3.5 255.255.255.0 19.23.2.12                  

OBSERVAÇÃO: 255.255.255.0 deve ser excluído da lista acima.

    
por yael 23.06.2013 / 15:32

1 resposta

3

Eu não sei porque seu código não funciona para as entradas apresentadas. Ele faz no meu sistema em ksh.

Mas seu código original tem um problema: a parte condicional i<${#aa[@]} é frágil - desde ${#aa[@]} , ou seja, o tamanho da matriz é diminuído após cada unset - mas os elementos da matriz a seguir não são deslocados automaticamente para a esquerda. Para o seu exemplo

45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12

isso não faz diferença - mas faria diferença para - digamos:

45.32.3.5 255.0.0.0 19.23.2.12 255.255.255.0

Eu melhorei o código com relação a esse problema (observe a atribuição antes da entrada do loop). Eu também eliminei um loop interno (usando um array associativo) que melhora o tempo de execução de quadrático para linear:

$ cat x.sh

exibe:

aa=(45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12)
bb=([255.0.0.0]=1 [255.255.255.0]=1)

print Size of input ${#aa[*]}
print Size of exclude list ${#bb[*]}

n=${#aa[*]}
for ((i=0; i<$n; ++i))
do
  if [[ ${bb[${aa[i]}]} ]]
  then
    print Removing element with index $i: ${aa[i]}
    unset aa[i];
  fi
  print New size of input ${#aa[*]}
done

print Resulting size of input ${#aa[*]}
print Resulting elements ${aa[*]}

for ((i=0; i<$n; ++i))
do
  print Index $i, Value 'a['$i']'=${aa[$i]}
done

Produz a seguinte saída no Fedora 17:

$ ksh x.sh
Size of input 4
Size of exclude list 2
New size of input 4
Removing element with index 1: 255.0.0.0
New size of input 3
Removing element with index 2: 255.255.255.0
New size of input 2
New size of input 2
Resulting size of input 2
Resulting elements 45.32.3.5 19.23.2.12
Index 0, Value a[0]=45.32.3.5
Index 1, Value a[1]=
Index 2, Value a[2]=
Index 3, Value a[3]=19.23.2.12
    
por 23.06.2013 / 19:01