2009-06-19 11 views
16

Có một câu lệnh UNIX ngang bằng vớiLệnh Unix để tìm các nút giao cắt hoặc ngoại lệ của chuỗi?

sort | uniq 

để tìm nút giao thông chuỗi bộ hay "giá trị ngoại biên".

Ứng dụng ví dụ: Tôi có danh sách các mẫu html, một số trong số chúng có chuỗi {% load i18n%} bên trong, một số khác thì không. Tôi muốn biết những tập tin nào không.

chỉnh sửa: grep -L giải quyết vấn đề trên.

Làm thế nào về điều này:

file1:

mom 
dad 
bob 

file2:

dad 

% giao file1 file2

dad 

% trái độc đáo file1 file2

mom 
bob 

Trả lời

28

Dường như grep -L giải quyết thực vấn đề của người đăng, nhưng đối với câu hỏi thực tế hỏi, tìm giao điểm của hai bộ chuỗi, bạn có thể muốn xem xét lệnh "comm". Ví dụ, nếu file1file2 từng có một danh sách được sắp xếp từ, một từ trên mỗi dòng, sau đó

$ comm -12 file1 file2 

sẽ tạo ra những lời chung cho cả tập tin.Tổng quát hơn, được đưa ra đầu vào sắp xếp file file1file2, lệnh

$ comm file1 file2 

sản xuất ba cột sản lượng

  1. dòng chỉ trong file1
  2. dòng chỉ trong file2
  3. dòng trong cả file1 và file2

Bạn có thể chặn cột N ở đầu ra với tùy chọn -N. Vì vậy, lệnh trên, comm -12 file1 file2, loại bỏ cột 1 và 2, chỉ để lại các từ phổ biến cho cả hai tệp.

+2

Đừng quên chạy các tệp của bạn thông qua sắp xếp trước khi so sánh. Tôi đã làm, và kết quả đã gửi cho tôi một cuộc săn đuổi ngỗng hoang dã. –

+1

Tôi đề cập ở trên rằng mỗi tệp chứa "danh sách các từ được sắp xếp", nhưng nó có thể không nhảy ngay tại bạn. –

5

Có lẽ tôi hiểu nhầm câu hỏi, nhưng tại sao không sử dụng grep để tìm chuỗi (sử dụng tùy chọn -L để in tên tệp không có chuỗi trong đó) .

Nói cách khác

grep -L "{% load i18n %}" file1 file2 file3 ... etc 

hoặc với các kí hiệu cho tên tập tin cho phù hợp.

+0

cảm ơn, người đàn ông! nó hoạt động. – Evgeny

+1

Để tìm kiếm nhanh hơn, tôi cũng sử dụng -F, vì nó chỉ là một chuỗi cố định. –

+0

điều gì về giao lộ được đặt? – Evgeny

2

từ người đàn ông grep

-L, --files-without-match 

Suppress ra bình thường; thay vào đó, hãy in tên của mỗi tệp đầu vào mà từ đó không có kết quả đầu ra nào được in . Quá trình quét sẽ dừng lại trên kết quả phù hợp đầu tiên.

Vì vậy, nếu mẫu của bạn là file .html bạn muốn:

grep -L '{% load i18n %}' *.html 
7

Intersect:

# sort file1 file2 | uniq -d 
dad 

Left độc đáo:

# sort file1 file2 | uniq -u 
bob 
mom 
+0

Giao cắt hoạt động, nhưng không có duy nhất. Nó hiển thị các giá trị duy nhất trên toàn bộ tập hợp, chứ không phải những giá trị duy nhất trong lần đầu tiên. –

2

Từ http://www.commandlinefu.com/commands/view/5710/intersection-between-two-files:

Giao lộ giữa hai (phân) file:

grep -Fx -f file1 file2 

dòng trong file2 mà không phải là trong file1:

grep -Fxv -f file1 file2 

Giải thích:

  • Tùy chọnyêu cầu grep đọc các mẫu tìm kiếm từ một tệp. Điều đó có nghĩa là nó thực hiện tìm kiếm tệp 2 cho mỗi dòng trong tệp1.
  • Các -F tùy chọn bảo grep để xem thuật ngữ tìm kiếm như dây cố định, và không phải là mô hình, do đó a.c sẽ chỉ phù hợp a.c và không abc,
  • Các -x tùy chọn bảo grep để thực hiện tìm kiếm toàn bộ dây chuyền, vì vậy mà " foo "trong tệp 1 sẽ không khớp" foobar "trong tệp2.
  • Theo mặc định, grep sẽ chỉ hiển thị các đường khớp, cho bạn giao lộ. Tùy chọn -v yêu cầu grep chỉ hiển thị các dòng không phù hợp, cung cấp cho bạn các dòng duy nhất cho tệp2.