Проверить длину поля с помощью awk

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

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

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

Берни

Ответ 1

Все ваши скобки несогласованы. Выражение 'if' должно содержаться в скобках, то есть

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

у вас этого нет, и у вас больше закрывающих скобок, чем открытие скобок - так что баланс также выключен; если подсчитать скобки (приращение для open, декремент для закрытия), мы получим в итоге -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 }'

Ответ 2

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

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...
'

Ответ 3

У вас есть несогласованная/несбалансированная скобка в условном выражении. Попробуйте:

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