2011-01-10 26 views
15

kullanarak ben 3 alanların bir dosya var:Kontrol alan uzunluğu awk

Ben alanlar aşağıdaki uzunlukları uygun olup olmadığı kontrol ihtiyaç
123710337783,351898014413150,123028040249634 
123710337785,352934028758390,123028040109275 

: Bu çalıştırırken bir hata alıyorum

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

Lütfen yardım edin.

Bernie

+2

Hata nedir? –

cevap

13

Tüm parantezleriniz uyuşmuyor. Bir 'eğer' ifadesi yani

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

Eğer bu yok, parantez içinde yer almalıdır ve parantez açarak daha fazla kapanış parantez var - yani denge de kapalıdır; Biz (açık artış, yakın için eksiltme) dirsekleri sayısı ise, biz açık olan daha çok üç parantez kapatma -3 0 yerine toplam sonuna kadar:

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

Yani, yerine bu deneyin

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

Sen şartlı içinde uyumsuz/dengesiz parantez var. Deneyin:

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

yapmanız için gidiyoruz tüm yazdırma ise, o varsayılan koşulu olarak ifade yerleşti: her şeyin yeniden dengeler

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

Eğer girişteki satırları filtrelemek için çalışıyorsanız t karşılamayan dosya onun kriterleri:

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