Проверить длину поля с помощью 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; }