2013-03-27 33 views
6

Sử dụng awk, bạn sẽ gán giá trị 'null' như thế nào để đọc?awk - nếu cột = null

Tôi chắc chắn có một ký tự đặt cho điều này, tôi không thể tìm thấy nó.

Ví dụ,

Tôi đã có một chuỗi các awk như thế này:

awk ' 
$3==24{print "stuff"} 
$3==23{print "stuff"} 
' 

tôi cần phải biết làm thế nào để giải thích cho colums trống bằng cách sử dụng định dạng tương tự để nếu $ 3 = blank { in "stuff"}

Cảm ơn!

+0

Nếu '$ 3' trống, bạn có mong đợi có các giá trị không trống cho' $ 4' vv trên cùng một dòng không? Điều gì xảy ra với '$ 3 ==" "' là điều kiện? –

+0

$ 3 là cột cuối cùng trong tệp. Một số dòng chỉ có 2 cột – Numpty

+1

Vì vậy, 'NF == 2' hoặc' NF == 3' cho bạn biết liệu $ 3 có được đặt hay không, phải không? Ngẫu nhiên, bạn có thể nghĩ về việc sử dụng '$ 3 == 24 {print" nội dung "; next} 'như một hành động, vì điều đó tiết kiệm' awk' kiểm tra xem 24 bằng 23 (không phải là). –

Trả lời

9

Hãy thử làm điều này:

awk ' 
    $3==24{print "stuff"} 
    $3==23{print "stuff"} 
    !$3{print "null"} 
' file.txt 

Nếu bạn cần phải xử lý $3 nếu nó không (false cho awk), hãy thử làm điều này:

!$3 && $3 != 0{print "null"} 
+1

Yuuuup, chỉ cần chuyển! $ 1 đến! $ 3 :) – Numpty

+1

Cảm ơn bạn lần nữa Sputnick! – Numpty

+0

bài chỉnh sửa phù hợp –

7

Trong chế biến awk mặc định, không có những điều như vậy dưới dạng cột "trống".

Các trường được phân tách bằng khoảng trắng, tức là, theo một hoặc nhiều hơn các ký tự khoảng trắng (tab và khoảng trắng, về cơ bản). Vì vậy, cho đầu vào này:

this that the_other 
foo  bar 

cho dòng đầu tiên $1, $2, và $3this, that, và the_other, tương ứng, nhưng đối với dòng thứ hai bar$2, bất kể có bao nhiêu khoảng trống có giữa trường đầu tiên và thứ hai.

Bạn có thể có các lĩnh vực có sản phẩm nào nếu bạn chỉ định một tách lĩnh vực khác nhau:

$ (echo 'this:that:the_other' ; echo 'foo::bar') | awk -F: '{print $3}' 
the_other 
bar 

Hoặc, nếu bạn muốn thiết lập tách lĩnh vực trong kịch bản riêng của mình:

$ (echo 'this:that:the_other' ; echo 'foo::bar') | \ 
    awk 'BEGIN { FS = ":" } {print $3}' 
the_other 
bar 

Nhưng bạn có thể sử dụng biểu thức chính quy làm dấu tách trường:

$ (echo 'this that the_other' ; echo 'foo bar') | \ 
    awk 'BEGIN { FS = "[ ]" } {print $3}' 
the_other 
bar 

(Một số rất Triển khai Awk cũ có thể không hỗ trợ các cụm từ thông dụng ở đây.)

Cụm từ thông dụng "[ ]" không được xử lý đặc biệt giống như ký tự khoảng trắng.

Tài liệu tham khảo để hướng dẫn GNU AWK:

Default field splitting:

Fields thường được phân cách bằng chuỗi khoảng trắng (số lượng, TAB, và dòng mới), chứ không phải bởi khoảng trắng. Hai dấu cách liên tiếp không phân định trường trống.Giá trị mặc định của dấu tách trường FS là một chuỗi chứa một dấu cách, " ". Nếu awk diễn giải giá trị này theo cách thông thường, mỗi ký tự khoảng cách sẽ tách các trường, do đó, hai không gian liên tiếp sẽ tạo ra một trường trống giữa chúng. Lý do điều này không xảy ra là một không gian đơn lẻ là giá trị FS là một trường hợp đặc biệt - nó được thực hiện để xác định cách mặc định của việc phân định các trường .

Nếu FS là bất kỳ ký tự đơn nào khác, chẳng hạn như ",", thì mỗi lần xuất hiện của ký tự đó sẽ tách hai trường. Hai lần xuất hiện liên tiếp phân định trường trống. Nếu ký tự xảy ra ở đầu hoặc kết thúc của dòng, điều đó cũng sẽ phân định trường trống. Ký tự không gian là ký tự đơn duy nhất không tuân theo các quy tắc này.

Using Regular Expressions to Separate Fields.

Nhưng hãy cẩn thận với điều này; hoặc bạn sẽ phải sửa đổi tệp để sử dụng dấu tách khác hoặc phân tích cú pháp của bạn sẽ nhạy cảm với số khoảng trắng giữa các trường (foo bar (với một ô trống) sẽ khác với foo bar (với hai khoảng trống)).

Tùy thuộc vào ứng dụng của bạn, bạn có thể xem xét phân tích cú pháp các dòng theo số cột thay vì các trường được công nhận awk.

+2

wrt '" ít nhất là trong GNU Awk, bạn có thể sử dụng cụm từ thông dụng làm dấu phân cách trường "' - đó là sự thật của tất cả các lổ. GNU awk chỉ đặc biệt trong vấn đề này bằng cách cho phép RS là một regexp. –

+0

Cảm ơn bạn đã giải thích - không nắm bắt điều này sớm hơn – Numpty

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