2016-08-30 8 views
-2

Предположим, у меня есть файл с содержимым ниже.Определение того, соответствует ли заданный столбец во всех строках файла критериям

ok  yes bad 
ok  yes good 
ok  yes bad 
ok  yes good 
ok  yes bad 
ok  yes good 

Мне нужно написать программу оболочки сценария или AWK обыскать весь 3-й столбец и если весь столбец хорошо, то печать, как «Everthing выглядит хорошо» и упаковывают, если он найдет кого-нибудь плохое, то печать, как «вещи не в порядке»

+4

Что ваш пытался до сих пор? – John1024

ответ

2

Делайте это с помощью простого AWK условия однострочника:

awk 'BEGIN {ok=1;} $3=="bad" { ok=0 } END { if (ok==0) {print "Things are not okay"} else { print "Everything looks good"} }' yourfile 

BEGIN блока инициализирует ok к 1 перед началом файла разбора. По умолчанию: все нормально, если не найдено плохого.

В вашем файле есть разделение естественного пространства/табуляции, нет необходимости настраивать разделитель полей awk: $3 - это прямое третье поле, которое нам нужно. Просто проверьте, если встречается bad где-то, и если да, отмените флаг ok.

END блок выполнен в конце файла. Проверьте ok и распечатайте соответствующее сообщение.

+0

Цель состоит в том, чтобы отсканировать весь файл. Вы хотите установить флаг и распечатать в блоке END. –

+0

@jean: но печать несколько раз. Я хочу, чтобы awk просматривал весь столбец, и если весь столбец имеет значение «хорошо», тогда он должен печатать только ОДИН раз, в этом случае он печатает несколько раз. – suru1432002

+0

@ suru1432002, обратите внимание на изменения - теперь это делается. –

0
$ awk '$3=="bad"{f=1; exit} END{print (f ? "Things are not OK" : "Everything looks good")}' file 
Things are not OK 

Вышеприведенные устанавливает флаг и exist сек основной рабочий цикл (Примечание: exit не выходит из программы, только неявный цикл, который читает входной сигнал, так что потом она принимает вас в раздел END) в первый раз он находит «плохой», поэтому он максимально эффективен, а затем в секции END он использует трехмерное выражение для печати соответствующего сообщения на основе установленного флага.

Если вы будете делать какие-либо манипуляции с текстом в своей жизни, прочитайте книгу «Эффективное программирование Awk», 4-е издание от Арнольда Роббинса, чтобы узнать, как сделать это лаконично, эффективно, надежно и портативно.

0

Вы можете сделать:

awk '$3=="bad"{bad++} END { if (bad>0) print bad " bads found"; else print "all goods!"}' file 

 Смежные вопросы

  • Нет связанных вопросов^_^