imprimindo apenas a primeira correspondência encontrada

1

Eu criei uma declaração que está procurando por informações específicas em cada linha (no meu caso "AAA", "BBB" ou "CCC"), se não houver essa informação N / A é impressa

{ k=0; for (i=1;i<=NF;i++) if ($i=="AAA") {print $i; k++}

else if ($i=="BBB") {print $i; k++}

else if ($i=="CCC") {print $i; k++}

if(k==0) print "N/A"}

O problema aparece quando há dois ou mais "AAA" na mesma linha. Ele me imprime todos os encontrados AAA e gostaria de parar de procurar após a primeira descoberta.

Além disso, gostaria de parar de verificar outras declarações (para BBB ou CCC) quando a contenção AAA é verdadeira.

Por exemplo, digamos que eu tenha uma entrada assim:

first imput line has AAA

second line has AAA and AAA

third line has BBB and

fourth line has CCC

fifth line has AAA and CCC

last line

na saída que eu quero:

AAA #(from first line)

AAA #(from second line, but only first found, I don't want two AAA to be printed)

BBB

CCC

AAA #(it found AAA and stop checking condition for CCC)

N/A #(no AAA or BBB or CCC in this line)

Atenciosamente, lucas

    
por lucas 13.12.2013 / 21:28

2 respostas

0

awk '{
    if (/\<AAA\>/ && /\<BBB\>/ && /\<CCC\>/)
       print
    else
       print "N/A"
}' 

\< e \> são expressões de limite de palavras.

    
por 13.12.2013 / 23:05
-2
awk '
/\<AAA\>/ {print "AAA"; naflag = 1;}
/\<BBB\>/ {print "BBB"; naflag = 1;}
/\<CCC\>/ {if(cflag == 0) {print "CCC"; naflag = 1; cflag = 1;}}
{if(naflag == 0) print "N/A"; naflag = 0;}
'
    
por 22.03.2016 / 20:27

Tags