Depois de imprimir a linha anterior, onde o arquivo contém um único token, agora é necessário atravessar o resultado para atender ao requisito

2

Eu usei o código abaixo para imprimir a linha anterior em que o arquivo contém um único token

#! /bin/ksh

file=input.txt
while read line
do
awk 'NF == 1 { print LAST } { LAST=$0 }'
done < "$file"

Agora preciso percorrer o resultado e preciso verificar a 9ª posição, 11ª, 13ª, etc. até o final da linha com as posições ímpares consecutivas e se essas posições não corresponderem a nenhum dos valores numéricos mencionados:

201 
230 
197 
193 
229 
200 
215 
226 
001 
198 

Ele deve imprimir o erro como CORRUPTED , se não AVAILABLE deve ser impresso.

Aqui está o exemplo do meu arquivo:

59 6 18 2014 169 7 14 2 7671912 7849744 201 4
60 6 19 2014 170 5 49 2 7671912 7849744 201 5
61 6 20 2014 171 6 8 2 7671912 7849744 201 6
62 6 23 2014 174 5 3 2 7671912 7849744 201 7
63 6 23 2014 174 7 17 2 7671912 7849744 201 8
64 6 24 2014 175 16 13 2 7671912 7849744 201 9
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
10
1 1 49 6 16 2014 7 39 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 2 49 6 17 2014 13 15 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 3 49 6 18 2014 1 38 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 4 49 6 18 2014 7 14 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 5 49 6 19 2014 5 49 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871

Se considerarmos isso como exemplo, a 9ª posição é 7671912

NOTA: O código também deve ser viável em qualquer outro arquivo.

    
por nalini 30.06.2014 / 08:23

1 resposta

2

Tente isto:

$ echo "65 6 25 2014 176 8 20 2 7671912 7849744 201 10" |
awk 'FNR == NR { a[$1]; next }
     {
         for (i = 9; i <= NF; i += 2) {
             if (!($i in a)) {
                 flag = 1;
             }
          }
          if (flag) {
              print "CORRUPTED";                  
          } else {
              print "AVAILABLE";                  
          }
     }
' file -
CORRUPTED

file contém todos os seus valores numéricos para comparar. Você deve substituir echo "65 6 25 2014 176 8 20 2 7671912 7849744 201 10" deste teste pelo script que imprime a linha anterior onde o arquivo contém um único token.

Explicação

  • FNR == NR { a[$1]; next } : ao processar file , salvamos cada número em file em uma matriz a .
  • Depois de ler file , percorremos todos os campos ímpares, começando no campo 9th , se o valor do campo não estiver na matriz a , definimos flag = 1 .
  • Finalmente, se flag estiver definido como 1, significa que temos pelo menos um campo cujo valor não está em file , por isso, imprimimos CORRUPTED , caso contrário, imprima AVAiLABLE .
por 30.06.2014 / 10:08