1

Я создал оператор, который ищет определенную информацию в каждой строке (в моем случае "AAA", "BBB" или "CCC"), если такой информации нет. N/A печатается

{k = 0; для (i = 1; i <= NF; i++) if ($ i == "AAA") {print $ i; к ++}

иначе if ($ i == "BBB") {print $ i; к ++}

иначе if ($ i == "CCC") {print $ i; к ++}

если (k == 0) выведите «N /A»}

Проблема появляется, когда есть две или более "AAA" в одной строке. Это печатает меня все найденные AAA, и я хотел бы прекратить поиск после первого поиска.

Кроме того, я хотел бы прекратить проверять другие операторы (для BBB или CCC), когда условие AAA истинно.

Например, скажем, у меня есть такой вход:

первая линия ввода имеет ААА

вторая строка имеет AAA и AAA

третья строка имеет BBB и

четвертая строка имеет CCC

пятая строка имеет AAA и CCC

Последняя линия

в выводе хочу:

AAA #(с первой строки)

AAA #(из второй строки, но только первый найден, я не хочу, чтобы два AAA печатались)

ВВВ

CCC

AAA #(он обнаружил AAA и остановил проверку состояния для CCC)

N/A #(в этой строке нет AAA, BBB или CCC)

С уважением, Лукас

2 ответа2

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

\< и \> - граничные выражения слова.

-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;}
'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .