Программа awk проверяет наличие 0 в каждой строке - PullRequest
0 голосов
/ 24 февраля 2019

Пример ввода:

a 54 65 43
b 45 12 98
c 99 0 12
d 3 23 0

Пример вывода: c,d

В основном я хочу проверить, есть ли значение в каждой строке, равное нулю, если да, выведите индекс (, б, в, г).

Мой код:

for(i=1;i<=NF;i++)if(i==0){print$1} Я получил синтаксическую ошибку

Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

другой подход

$ awk '/\y0\y/{print $1}' file
c
d

\y является оператором границы слова.Может быть только в gawk.

0 голосов
/ 25 февраля 2019

Чтобы ваш код работал, вам нужно изменить его на:

$ awk '{for(i=1;i<=NF;i++)if($i==0) print $1}' file
c                                                      
d        
  • Вам нужно поместить код в блок ({} пара).
  • Вынеобходимо использовать $i вместо i в условии if, $i означает i-й столбец.
  • Хотя в этом нет необходимости, лучше добавить пробел между командой и параметром.(print $1)

И лучше его немного улучшить:

awk '{for(i=1;i<=NF;i++)if($i==0) {print $1;next}}' file

Добавить next, чтобы избежать print $1 несколько раз, когда их большеодин 0 в строке.

Учитывая, что столбцы разделены пробелом, вы также можете сделать это следующим образом:

awk '/( |^)0( |$)/{print $1}' file

Для этого не требуется GNU awk.
/( |^)0( |$)/ - это RegEx , а в команде это сокращение от $0 ~ /( |^)0( |$)/.
^ означает начало строки, $ конец строки здесь.

0 голосов
/ 24 февраля 2019

Коду нужен набор скобок.

awk '{ for(i=1;i<=NF;i++)if($i==0) print $1}' filename

(print не не нужны скобки, поэтому я их снял.)

Еслипервое поле никогда не содержит числа, возможно, начните цикл с 2.

Общая форма сценария Awk представляет собой последовательность пар

condition { action }

, где последний нуждаетсябрекеты вокруг него.При отсутствии условия действие выполняется в каждой строке безоговорочно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...