Проверьте длину поля с помощью awk - PullRequest
22 голосов
/ 10 января 2011

У меня есть файл из 3 полей:

123710337783,351898014413150,123028040249634
123710337785,352934028758390,123028040109275

Мне нужно проверить, чтобы поля соответствовали следующей длине:

Field 1 = 12
Field 2 = 15 or 16
Field 3 = 15

Я получаю ошибку при запуске этого:

awk -F, '{if(length($2) == 15 ) || length($2) == 16) && length($1) == 12 && length($3)) == 15) print  }'

Пожалуйста, помогите.

Берни

Ответы [ 3 ]

17 голосов
/ 10 января 2011

Все ваши скобки не совпадают.Выражение 'if' должно быть заключено в квадратные скобки, т. Е.

if (X == 45) ...
if ((X == 45) || (Y == 23)) ...

у вас его нет, и у вас больше закрывающих скобок, чем открывающих скобок - так что баланс также отключен;если мы посчитаем скобки (приращение для открытия, уменьшение для закрытия), мы получим в итоге -3 вместо 0, поэтому закрываем на три скобки больше, чем у нас:

            1      2  1       0          1  0     -1          0 -1                0 -1 -2     -3
awk -F, '{if(length($2) == 15 ) || length($2) == 16) && length($1) == 12 && length($3)  ) == 15) print  }'

Итак, попробуйтеэто вместо этого, который перебалансирует все:

awk -F, '{ if (((length($2) == 15 ) || length($2) == 16) && (length($1) == 12 && length($3) == 15)) print }'
8 голосов
/ 10 января 2011

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

awk -F, 'length($1)==12 && (length($2)==15 || length($2)==16) && length($3)==15'

Если вы пытаетесь отфильтровать строки во входном файле, которые не соответствуютэтот критерий:

awk -F, '
    length($1)!=12 || length($2)<15 || length($2)>16 || length($3)!=15) {next}
    # do other stuff...
'
5 голосов
/ 10 января 2011

Вы ошиблись / несбалансированы круглые скобки в условных.Попробуйте:

{ if ((length($2) == 15 || length($2) == 16) && length($1) == 12 && length($3) == 15) print; }
...