Sử dụng danh sách các từ để grep trong danh sách khác


8

Tôi đã có một danh sách với 250 dòng trong đó. Tôi phải chạy tất cả chúng thông qua một máy chủ web để có được danh sách đầu ra. Tuy nhiên, danh sách này trả về nhiều dòng hơn tôi quan tâm. Nói, tôi list.txtlà:

a.1
b.1
etc

thì đầu ra là output.txt:

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

Có thể sử dụng lệnh grep để tìm kiếm tất cả các từ trong list.txt trong output.txt và sau đó tạo danh sách "mong muốn" Want.txt không? Tôi cần toàn bộ dòng trong output.txt của tôi Tôi mới viết kịch bản, nhưng điều tôi muốn là một cái gì đó như

grep list.txt output.txt > wanted.txt

Tôi đã không thể tìm thấy bất kỳ ví dụ về điều này


Có phải cả hai theo thứ tự chữ cái như ví dụ của bạn?
Oli

Không, tôi có một thứ tự không theo thứ tự chữ cái cụ thể trong list.txt của mình, nhưng output.txt là theo thứ tự chữ cái, nhưng tôi muốn nó chỉ chứa các "lần truy cập" cho list.txt của tôi theo cùng thứ tự không theo thứ tự chữ cái
Ditte

Câu trả lời:


11

Tôi sẽ bỏ qua grepcho cái này. Nó tốt cho các biểu thức thông thường nhưng có vẻ như bạn không thực sự cần điều đó ở đây. commcó thể so sánh hai tập tin và hiển thị cho bạn giao điểm. Sử dụng các ví dụ chính xác của bạn:

$ comm -12 list.txt output.txt 
a.1
b.1
etc

Điều này nhanh hơn bất kỳ grep nào nhưng nó phụ thuộc rất nhiều vào các tệp được sắp xếp. Nếu chúng không có, bạn có thể sắp xếp trước chúng nhưng điều đó sẽ thay đổi đầu ra để nó cũng được sắp xếp.

comm -12 <(sort list.txt) <(sort output.txt) 

Ngoài ra, câu trả lời này từ iiSeymour sẽ cho phép bạn làm điều đó với grep. Các cờ yêu cầu một tệp đầu vào và buộc tìm kiếm toàn chuỗi, cố định. Điều này sẽ không dựa vào đơn hàng mà sẽ dựa trên output.txtđơn đặt hàng. Đảo ngược các tệp nếu bạn muốn chúng theo thứ tự list.txt.

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

Nếu bạn list.txtthực sự lớn, bạn có thể phải giải quyết một chút này lặp đi lặp lại nhiều hơn và vượt qua mỗi dòng để grep riêng. Điều này sẽ ồ ạt tăng thời gian xử lý. Ở trên, bạn sẽ đọc output.txtmột lần, nhưng theo cách này, bạn sẽ đọc và xử lý nó cho mỗi dòng list.txt. Thật kinh khủng ... Nhưng nó có thể là lựa chọn duy nhất của bạn. Về mặt tích cực, sau đó nó sắp xếp mọi thứ theo list.txtthứ tự.

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc

1
Điều đó thực sự thông minh! Lý do cho -12 là gì?
Ditte

3
-1triệt tiêu các dòng duy nhất cho tệp đầu tiên, -2triệt tiêu các dòng duy nhất cho tệp thứ hai và -3triệt tiêu các dòng chung cho cả hai. Do đó, để có được những dòng chung, chúng tôi đàn áp những điều lạ thường -12.
Oli

đẹp! Tôi nghĩ rằng tôi sẽ sử dụng lệnh comm. Và sau đó khi tôi muốn sắp xếp output.txt để có cùng thứ tự như list.txt, tôi sẽ chỉ sử dụng comm -12 <(sort list.txt) <(sort output.txt) sau đó?
Ditte

Lệnh comm không cung cấp cho tôi toàn bộ dòng trong result.txt (và tôi cần tất cả để có được thông tin từ đó). Nhưng nếu tôi thử lệnh grep, nó sẽ hứa với tôi về grep: hết bộ nhớ. Điều đó có nghĩa là, nó quá lớn?
Ditte

ví dụ thứ 2 có STDIN dự phòng chuyển hướng shell sẽ đánh dấu là lỗi. hoặc tạo các tệp tạm thời hoặc sử dụng một fd bổ sung với một loại sắp xếp nền cho nó (khó khăn trong hầu hết các shell) ... đây là một câu hỏi lập trình tốt hơn được hỏi về Stack Overflow . Cá nhân, tôi sẽ làm điều này trong python.
Skaperen 11/03/2015
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.