2013-07-24 11 views
8

Tôi có một kịch bản awk kiểm tra rất nhiều mẫu có thể, làm một cái gì đó cho mỗi mẫu. Tôi muốn một cái gì đó được thực hiện trong trường hợp không có mô hình nào phù hợp. tức là một cái gì đó như thế này:awk: hành động "mặc định" nếu không có mẫu nào được khớp?

/pattern 1/ {action 1} 
/pattern 2/ {action 2} 
... 
/pattern n/ {action n} 
DEFAULT {default action} 

đâu tất nhiên, "DEFAULT" dòng là không có cú pháp awk và tôi muốn biết nếu có một cú pháp như vậy (như thường có trong Xem bằng Tiếng Anh/trường hợp báo cáo trong nhiều ngôn ngữ lập trình). Tất nhiên, tôi luôn có thể thêm một lệnh "tiếp theo" sau mỗi hành động, nhưng điều này là tẻ nhạt trong trường hợp tôi có nhiều hành động, và quan trọng hơn, nó ngăn cản tôi không khớp dòng đó với hai hoặc nhiều mẫu. Quay lại đầu trang |||||||||||||||||||||||||||||||||

Trả lời

11

Bạn có thể đảo ngược trận đấu sử dụng toán tử phủ định ! nên cái gì như:

!/pattern 1|pattern 2|pattern/{default action} 

Nhưng đó là khá khó chịu cho n>2. Hoặc bạn có thể sử dụng cờ:

{f=0} 
/pattern 1/ {action 1;f=1} 
/pattern 2/ {action 2;f=1} 
... 
/pattern n/ {action n;f=1} 
f==0{default action} 
1

Không có giải pháp "bảo trì miễn phí" cho DEFAULT-Branch khi bị lúng túng.

Khả năng đầu tiên tôi sẽ đề xuất là hoàn thành từng nhánh của mẫu khớp với câu lệnh 'tiếp theo'. Vì vậy, nó giống như một tuyên bố phá vỡ. Thêm hành động cuối cùng vào cuối phù hợp với mọi thứ. Đó là nhánh DEAFULT.

Khả năng khác sẽ là: đặt cờ cho mỗi chi nhánh có kết hợp mẫu (ví dụ: các chi nhánh không mặc định của bạn) ví dụ: bắt đầu hành động của bạn với NONDEFAULT = 1;

Thêm hành động cuối cùng ở cuối (nhánh mặc định) và xác định điều kiện NONDEFAULT == 0 instaed của kết quả biểu thức reg.

+0

Bên cạnh sai lầm khi đề xuất sử dụng 'next', câu trả lời này khác với câu trả lời của tôi như thế nào? –

+0

ooops - quyền của bạn - xin lỗi tôi. – tue

7

GNU awk có chuyển báo cáo:

$ cat tst1.awk 
{ 
    switch($0) 
    { 
    case /a/: 
     print "found a" 
     break 

    case /c/: 
     print "found c" 
     break 

    default: 
     print "hit the default" 
     break 
    } 
} 

$ cat file 
a 
b 
c 
d 

$ gawk -f tst1.awk file 
found a 
hit the default 
found c 
hit the default 

Ngoài ra với bất kỳ awk:

$ cat tst2.awk 
/a/ { 
    print "found a" 
    next 
} 

/c/ { 
    print "found c" 
    next 
} 

{ 
    print "hit the default" 
} 

$ awk -f tst2.awk file 
found a 
hit the default 
found c 
hit the default 

Sử dụng "phá vỡ" hay "bên cạnh" như/khi bạn muốn, giống như trong lập trình khác ngôn ngữ.

Hoặc, nếu bạn thích sử dụng một lá cờ:

$ cat tst3.awk 
{ DEFAULT = 1 } 

/a/ { 
    print "found a" 
    DEFAULT = 0 
} 

/c/ { 
    print "found c" 
    DEFAULT = 0 
} 

DEFAULT { 
    print "hit the default" 
} 

$ gawk -f tst3.awk file 
found a 
hit the default 
found c 
hit the default 

Nó không phải exaclty ngữ nghĩa giống như một "mặc định" true mặc dù vậy nó sử dụng như thế có thể gây hiểu nhầm. Tôi sẽ không bình thường ủng hộ sử dụng tất cả các trường hợp tên biến nhưng trường hợp thấp hơn "mặc định" sẽ xung đột với từ khóa gawk để kịch bản sẽ không được di động để diều hâu trong tương lai.

0

Một khá sạch sẽ, cách giải quyết di động đang sử dụng một tuyên bố if:

Thay vì:

pattern1 { action1 } 

pattern2 { action2 }  
... 

người ta có thể sử dụng như sau:

{  
    if (pattern1) { action1 } 

    else if (pattern2) { action2 } 

    else { here is your default action } 
} 

Như đã đề cập ở trên, GNU awk có báo cáo chuyển đổi, nhưng việc triển khai awk khác không, vì vậy việc sử dụng nút chuyển sẽ không thể di chuyển được.