2011-01-10 3 views
15

У меня есть файл 3-х полей:Проверить длину поля, используя 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 }' 

Помогите.

Bernie

+2

Какая у вас ошибка? –

ответ

13

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

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

Вы имеете несоответствующие/несбалансированный скобку в условна. Попытайтесь:

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

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

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

Если вы пытаетесь, чтобы отфильтровать строки в входе файл, который не соответствует t его критерии:

awk -F, ' 
    length($1)!=12 || length($2)<15 || length($2)>16 || length($3)!=15) {next} 
    # do other stuff... 
'