2012-08-14 34 views
28
  1. Tôi đang sử dụng AWK tập lệnh để xử lý một số nhật ký.
  2. Ở một nơi tôi cần kiểm tra xem giá trị biến có là null hoặc trống để đưa ra quyết định.

Bất kỳ ý tưởng nào về cách đạt được điều tương tự?Làm cách nào để kiểm tra xem giá trị biến trong tập lệnh AWK là null hay trống?

awk ' 

{ 
    { 
     split($i, keyVal, "@") 
     key=keyVal[1]; 
     val=keyVal[2]; 
     if(val ~ /^ *$/) 
     val="Y"; 

    } 

} 

' File 

Tôi đã thử với

1) if(val == "") 

2) if(val ~ /^ *$/) 

không làm việc trong cả hai trường hợp.

+0

Bạn có thể cung cấp một số dữ liệu mẫu không? – Levon

Trả lời

37

Việc so sánh với "" nên đã làm việc, vì vậy đó là một chút lẻ

Là một trong những lựa chọn hơn, bạn có thể sử dụng chức năng length(), nếu không, biến của bạn là null/trống. Ví dụ:

if (length(val) == 0) 

Ngoài ra, có lẽ biến tích hợp NF (số trường) có thể hữu ích? Vì chúng tôi không có quyền truy cập vào dữ liệu đầu vào của bạn nên thật khó để nói, nhưng có khả năng khác.

+0

Cảm ơn, chiều dài (val) đang hoạt động đối với tôi. – samarth

9

Nó hoạt động tốt đối với tôi

$ awk 'BEGIN{if(val==""){print "null or empty"}}' 
null or empty 

Bạn không thể phân biệt giữa biến là trống rỗng và vô giá trị, khi bạn truy cập "unset" biến, awk chỉ khởi tạo nó với giá trị mặc định (ở đây nó là "" - chuỗi rỗng). Bạn có thể sử dụng một số loại giải pháp thay thế, ví dụ: đặt val_accessed biến thành 0 và sau đó đến 1 khi bạn truy cập. Hoặc cách tiếp cận đơn giản hơn (hơi "hackish") thiết lập val là "unitialized" (hoặc một số giá trị khác không thể xuất hiện khi chạy chương trình của bạn).

PS: kịch bản của bạn trông lạ đối với tôi, các dấu ngoặc lồng nhau là gì?

2

Bạn có thể trực tiếp sử dụng biến mà không so sánh, giá trị trống/không/không được xem là false, mọi thứ khác là true.

Xem ở đây:

# setting default tag if not provided 
if (! tag) { 
     tag="devf" 
} 

Vì vậy, kịch bản này sẽ có biến tag với giá trị devf trừ nếu người dùng gọi nó là như thế này:

$ awk -v tag=custom -f script.awk targetFile 

Điều này đúng như của: GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)

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