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