2011-01-10 26 views
15

Tôi có một tập tin của 3 lĩnh vực:Kiểm tra chiều dài lĩnh vực sử dụng awk

123710337783,351898014413150,123028040249634 
123710337785,352934028758390,123028040109275 

Tôi cần phải kiểm tra xem các nghề đạt độ dài sau:

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

tôi nhận được một thông báo lỗi khi chạy này:

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

Vui lòng hỗ trợ.

Bernie

+2

Bạn gặp phải lỗi gì? –

Trả lời

13

Tất cả các dấu ngoặc của bạn không khớp. Biểu thức 'if' phải được chứa trong ngoặc đơn, tức là,

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

bạn không có biểu tượng này và bạn có nhiều dấu ngoặc đóng hơn dấu ngoặc mở - do đó số dư cũng bị tắt; nếu chúng ta đếm ngoặc (increment cho mở, sụt lần cho đóng), chúng tôi kết thúc với tổng số -3 thay vì 0, vì vậy đóng hơn ba dấu ngoặc hơn chúng ta đã mở:

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

Vì vậy, hãy thử này để thay thế mà tái cân bằng tất cả mọi thứ:

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

Bạn có dấu ngoặc đơn không khớp/không cân bằng trong điều kiện. Hãy thử:

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

Nếu tất cả các bạn đang đi làm là in ấn, sau đó đặt biểu hiện của bạn như là điều kiện mặc định:

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

Nếu bạn đang cố gắng để lọc ra các dòng trong đầu vào của bạn tệp không đáp ứng t tiêu chí của anh ấy:

awk -F, ' 
    length($1)!=12 || length($2)<15 || length($2)>16 || length($3)!=15) {next} 
    # do other stuff... 
' 
Các vấn đề liên quan