combinando o loop “for” com a instrução “if”

1

Eu criei um script para o awk. Estou combinando o loop "for" com a instrução "if". Está pesquisando cada linha pela palavra "ABC", que pode ocorrer em um lugar diferente na linha. Parece abaixo:

{for (i=1;i<=NF;i++) if ($i=="ABC") print $(i-2)}

O problema aparece quando não há "ABC" na linha e eu gostaria de imprimir uma informação sobre isso. Com o script abaixo, ele me fornece uma informação para cada palavra da linha que é diferente de "ABC" e eu gostaria de APENAS UMA informação para a linha (não para cada palavra).

{for (i=1;i<=NF;i++) if ($i=="ABC") print $(i-2)

else if ($i=="ABC") print "no ABC in the line"}

Atenciosamente, lucas

    
por lucas 24.11.2013 / 19:11

2 respostas

2

Você disse ao seu script para verificar explicitamente cada campo (palavra) da linha. O que você quer fazer é simplesmente verificar se a linha em qualquer lugar contém a string ABC:

awk '{
      if(/ABC/){
        printf "line %s contains ABC
      }
       else{
       printf "line %s does not contain ABC\n",NR
      }
     }' file.txt

Se você executar isso em um arquivo com o seguinte conteúdo:

 this line has no string of interest
 this line contains ABC somewhere

você recebe:

line 1 does not contain ABC
line 2 contains ABC

Você não explicou por que estava imprimindo $(i-2) , mas se é isso que realmente precisa, você pode:

awk '{k=0; for (i=1;i<=NF;i++){
            if ($i=="ABC"){print $(i-2); k++}
           } 
           if(k==0){print "No ABC in line",NR}
     }' file.txt

O truque é a variável k . Está definido para 0 no início de cada linha. Quando você percorrer os campos, se um deles corresponder a ABC , k será definido como 1 . Portanto, depois que todos os campos tiverem sido processados, se k ainda for 0 , a linha não contiverá ABC e uma mensagem será impressa. A execução deste script no arquivo de exemplo que eu dei acima imprime:

No ABC in line 1
line
    
por 24.11.2013 / 19:33
0

Tente declarar uma variável chamada isFound antes do seu loop for . Após o print $(i-2) , defina isFound para true . Substitua sua declaração atual elseif por if dizendo se isFound é falso e imprima no ABC in line .

    
por 24.11.2013 / 19:36

Tags