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à $3
là this
, that
, và the_other
, tương ứng, nhưng đối với dòng thứ hai bar
là $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.
và 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.
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? –
$ 3 là cột cuối cùng trong tệp. Một số dòng chỉ có 2 cột – Numpty
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à). –