awk khớp một phần chuỗi (nếu cột / từ khớp một phần)


83

Tệp giả của tôi trông như thế này:

C1    C2    C3    
1     a     snow   
2     b     snowman 
snow     c     sowman

Tôi muốn lấy dòng nếu có chuỗi snowtrong $ 3. Tôi có thể làm như thế này:

awk '($3=="snow" || $3=="snowman") {print}' dummy_file

Nhưng cần có cách đơn giản hơn.

Câu trả lời:


157
awk '$3 ~ /snow/ { print }' dummy_file 

27
nói đúng, in không cần thiết: '$3~/snow/'đủ
SheetJS

2
Đáng buồn là liên kết đã chết: Đây là liên kết hiện tại shop.oreilly.com/product/9781565924277.do
Stedy

Mẫu của bạn là "tuyết", trong khi nếu có biểu tượng đặc biệt, như [\ "trong trường hợp của tôi, thì chỉ mục () là giải pháp tốt hơn.
Qiu

Có cách nào để phủ nhận séc không? Tôi biết chúng ta có thể sử dụng 'tiếp theo' thay vì 'in' và in mọi thứ khác, nhưng chỉ cần kiểm tra thứ gì đó với ít hướng dẫn hơn
Sahas

5
sử dụng ! ví dụ như awk '$ 3! ~ / foo /'
Ahmed Masud

41

Cũng có thể bằng cách tìm kiếm chuỗi con với hàm index ():

awk '(index($3, "snow") != 0) {print}' dummy_file

Phiên bản ngắn hơn:

awk 'index($3, "snow")' dummy_file

7
Câu trả lời này tốt hơn câu trả lời của Ahmed Masud, bởi vì nó xử lý "tuyết" dưới dạng một chuỗi chữ, không phải như một biểu thức chính quy.
jarno

6
Bạn có thể viết nó thậm chí còn đơn giản hơn:awk 'index($3, "snow")' dummy_file
Jarno

2
Tôi đồng ý rằng điều này tốt hơn câu trả lời của tôi.
Ahmed Masud


8

In các dòng trong đó trường thứ ba là snowhoặc snowmanchỉ:

awk '$3~/^snow(man)?$/' file

2

GNU sed

sed '/\s*\(\S\+\s\+\)\{2\}\bsnow\(man\)\?\b/!d' file

Đầu vào:

C1 C2 C3    
1 tuyết   
2 b người tuyết 
Người gieo hạt tuyết
      người tuyết tuyết

.. đầu ra:

1 tuyết
2 b người tuyết

9
Đây không thể là một câu trả lời phức tạp hơn cho một câu hỏi khá đơn giản.
Sam

1
Thêm vào đó, nó RẤT RẤT rủi ro khi sử dụng sedtoàn bộ từ ngữ. Mặc dù có thể về mặt kỹ thuật, nhưng để điều đó hoạt động một cách đáng tin cậy, tôi phải sử dụng các từ nhìn lại phía sau, nhìn về phía trước cũng như các !?cấu trúc khi nói về những từ không nên tuân theo. Điều này không có gì dành cho những người yếu tim, đó là điều chắc chắn. (Và dễ bị lỗi mà có thể tiêu thụ nhiều thời gian để tìm và sửa chữa chúng.)
Lỗi Cú pháp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.