2012-04-12 27 views
5

Tôi đang sử dụng awk để định dạng tệp đầu vào trong tệp đầu ra. Tôi có một số mẫu để điền vào các biến (như "một số mẫu" trong ví dụ). Các biến này được in theo định dạng bắt buộc trong khối END. Đầu ra phải được thực hiện ở đó vì thứ tự xuất hiện trong tệp đầu vào không được đảm bảo, nhưng thứ tự trong tệp đầu ra phải luôn giống nhau.awk: bắt `thoát 'trong khối END

BEGIN { 
    FS = "=|," 
} 


/some pattern/ { 
    if ($1 == 8) { 
     var = $1 
    } else { 
     # Incorrect field value 
     exit 1 
    } 
} 

END { 
    # Output the variables 
    print var 
} 

Vì vậy, vấn đề của tôi là tuyên bố exit trong mẫu. Nếu có một số lỗi và lệnh này được gọi, sẽ không có đầu ra nào cả hoặc có nhiều nhất là một thông báo lỗi. Nhưng khi hướng dẫn sử dụng gawk (here) cho biết, nếu lệnh exit được gọi trong khối mẫu, khối END sẽ được thực hiện ít nhất. Có cách nào để bắt exit như:

if (!exit_invoked) { 
    print var 
} 

hoặc một số cách khác để tránh in sản lượng trong khối END?

Stefan

chỉnh sửa: sử dụng các giải pháp từ Shellter.

Trả lời

6

bạn sẽ phải xử lý nó một cách rõ ràng, bằng cách thiết lập exit_invoked trước exit dòng, ví dụ:

BEGIN { 
    FS = "=|," 
} 


/some pattern/ { 
    if ($1 == 8) { 
     var = $1 
    } else { 
     # Incorrect field value 
     exit_invoked=1 
     exit 1 
    } 
} 

END { 
    if (! exit_invoked ) { 
     # Output the variables 
     print var 
    } 
} 

Tôi hy vọng điều này sẽ giúp.

+0

Cảm ơn, không nghĩ về giải pháp đơn giản này;) Tôi sẽ gói trong chức năng này để không quên tập hợp 'exit_invoked'. Stefan – Stefan

+1

@Stefan: Ý tưởng hay. Lưu ý rằng bạn có biến đó trong khi chơi, bạn có thể muốn đặt trong khối BEGIN, tức là 'exit_invoked = 0'. Một số sẽ phàn nàn rằng nó là không cần thiết và dư thừa. Tôi sẽ không làm điều đó bản thân mình, nhưng nó là một techinque tự tài liệu tốt. YRMV. Chúc may mắn. – shellter

+0

Tôi sẽ làm điều này vì tôi không viết chương trình 'awk' cho bản thân mình. Cảm ơn. – Stefan

-2
END { 
     # If here from a main block exit error, it is unlikely to be at EOF 
     if (getline) exit 
     # If the input can still be read, exit with the previously set status rather than run the rest of the END block. 

     ...... 
Các vấn đề liên quan