Làm cách nào tôi có thể chuyển hướng các dòng khớp với một tệp và các dòng không khớp với một tệp khác?


13

Có tập lệnh / chương trình / tiện ích nào có sẵn cho yêu cầu sau một cách tối ưu không?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch

Câu trả lời:


16

Bạn có thể sử dụng awkcho điều đó.

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

1
Tôi không hoàn toàn quen thuộc awknhưng tại thời điểm nào nó đánh giá >? Nếu được đánh giá mỗi lần áp dụng điều kiện, bạn sẽ kết thúc với hai tệp một dòng ...
Shadur

1
@Shadur >in tất cả đầu ra ra tệp, ghi đè các tệp hiện có. Nó không được đánh giá theo cách mà nó sẽ dẫn đến bất kỳ dòng mới nào ghi đè đầu ra cũ từ cùng một ví dụ awk. Nghĩa là, nếu có nhiều kết quả khớp, tệp "khớp" sẽ chứa mỗi kết quả được phân tách bằng OFS. Sự khác biệt giữa >>>tồn tại trong điều trị các tập tin hiện có.
Chris Xuống

10

Dưới đây là một sedví dụ:
Lưu ý: wlệnh của sed sẽ ghi đè lên tệp hiện có mỗi khi tập lệnh được chạy, nhưng chỉ khi lệnh ghi cụ thể đó được kích hoạt; vì thếrm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file

Đẹp. Không phân nhánh:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti

6

Bạn có thể chắp thêm các tập tin trong awk:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

hoặc ngắn hơn:

awk '{print >>(/pattern/?"matched":"unmatched")}'

Ví dụ của anh ấy cho thấy rằng anh ấy muốn ghi đè lên các tập tin nếu chúng tồn tại, không nối thêm.
Chris Xuống
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.