2008-10-17 35 views

Trả lời

9

Điểm mấu chốt ở đây là ký tự ống (|) phải được đặt vào vỏ. Sử dụng "\|" hoặc "'|'" để bảo vệ nó khỏi sự can thiệp của vỏ và cho phép nó được chuyển đến awk trên dòng lệnh.


Đọc các ý kiến ​​tôi thấy rằng các poster ban đầu trình bày một phiên bản đơn giản của vấn đề ban đầu liên quan đến lọc file trước khi lựa chọn và in ấn các lĩnh vực. Một đường chuyền qua grep đã được sử dụng và kết quả được đưa vào hoạt động để lựa chọn trường. Đó là tài khoản hoàn toàn không cần thiết cat file xuất hiện trong câu hỏi (nó thay thế grep <pattern> file).

Tốt, điều đó sẽ hiệu quả. Tuy nhiên, awk phần lớn là một công cụ phù hợp với mô hình của riêng nó, và có thể được tin cậy để tìm và làm việc trên các dòng phù hợp mà không cần phải gọi grep. Sử dụng một cái gì đó như:

awk -F\| '/<pattern>/{print $2;}{next;}' file 

Bit /<pattern>/ nói awk để thực hiện các hành động mà sau trên dây chuyền phù hợp với <pattern>.

Mất tìm kiếm {next;} là hành động mặc định bỏ qua dòng tiếp theo trong đầu vào. Nó không có vẻ là cần thiết, nhưng tôi có thói quen này từ lâu ...

3

Ký tự ống cần phải được thoát để vỏ không diễn giải nó. Một giải pháp đơn giản:

$ awk -F\| '{print $2}' file 

lựa chọn khác sẽ được trích dẫn nhân vật:

$ awk -F'|' '{print $2}' file 
16

Hoặc chỉ cần sử dụng một lệnh:

cut -d '|' -f FIELDNUMBER 
+0

Lưu ý rằng mấu chốt của vấn đề là ký tự ống, không phải lệnh được sử dụng. Nhưng đây là một giải pháp tốt. –

+0

Tôi nghĩ về nó, nhưng tôi muốn có một câu trả lời giải thích vấn đề. Đó là kinda điểm của bình luận của tôi, trên thực tế. ;-) –

+0

Sẽ là 'cut -d' | ' -f FIELDNUMBER FILENAME' – Andrea

0

Và 'file' không chứa những biểu tượng ống, vì vậy nó in không có gì. Bạn nên sử dụng 'cat file' hoặc chỉ cần liệt kê tập tin sau chương trình awk.

+0

Urg. Xin lỗi vì điều đó. Mã ban đầu grep'ed một tập tin sau đó đường ống đầu ra để awk. Tôi đã khử trùng lệnh, nhưng không thử nghiệm nó. :( –

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