2012-10-13 23 views
5

Giả sử tôi có hai tệp văn bản cần trích xuất dữ liệu. Các văn bản của hai tập tin như sau:Cách so sánh hai tệp văn bản cho cùng một văn bản chính xác bằng cách sử dụng BASH?

Tập 1:

1name - [email protected] 
2Name - [email protected] 
3Name - [email protected] 
4Name - [email protected] 

Tập 2:

email.com 
email.com 
email.com 
anotherwebsite.com 

file 2 là file 1 của danh sách tên miền, chiết xuất từ địa chỉ email. Đây không phải là tên miền giống nhau bằng bất kỳ phương tiện nào và khá ngẫu nhiên.

Làm cách nào để có được kết quả của tên miền khớp với Tệp 2 từ Tệp 1?

Cảm ơn bạn trước!

Trả lời

8

Giả sử rằng tự không quan trọng,

grep -F -f FILE2 FILE1 

nên làm các trick. (Điều này hoạt động vì một sự kiện ít được biết đến: tùy chọn -Fgrep không chỉ có nghĩa là "khớp với chuỗi cố định này", có nghĩa là "khớp với bất kỳ chuỗi cố định được phân tách bằng dòng mới nào.")

+0

Bạn là người tiết kiệm cuộc sống. Cảm ơn bạn! Có cách nào chúng ta có thể làm điều này để hiển thị nó trong cùng một định dạng như Tên - Địa chỉ email không? – user1742682

+0

Nó sẽ in toàn bộ các dòng từ FILE1 chứa bất kỳ chuỗi nào trong FILE2. Đó không phải là định dạng bạn muốn? – zwol

+0

Sai lầm của tôi! Nó hoạt động tốt ngay bây giờ! Vấn đề với định dạng của tôi. Cảm ơn bạn! : D – user1742682

0

Nếu tôi có bạn đúng, bạn muốn lọc cho tất cả các địa chỉ với máy chủ nêu trong file 2.

bạn có thể sau đó chỉ cần lặp trên File 2 và grep cho @<line>, tích lũy kết quả trong một tập tin mới hoặc một cái gì đó tương tự.

Ví dụ:

cat file2 | sort -u | while read host; do grep "@$host" file1; done > filtered 
+0

Chính xác! Nhưng với tên - Email @ ddress định dạng được sử dụng trong File 1. Nó có vẻ có vẻ vô nghĩa, nhưng nó chắc chắn có một điểm cho tôi! – user1742682

+0

Điều này sẽ đọc tất cả tệp1 cho mỗi dòng trong tệp2. Nó có thể hoàn thành công việc, nhưng nó không hiệu quả lắm. – jordanm

+0

@jordanm Đồng ý. Tôi là tất cả cho giải pháp 'grep -f -F'. Tôi đã cố gắng để được khái niệm. – nemo

2

Các công thức:

join <(sed 's/^.*@//' file1|sort -u) <(sort -u file2) 

nó sẽ ra giao điểm của tất cả các tên miền trong file1 và file2

1

Xem BashFAQ/036 để xem danh sách các giải pháp bình thường để này loại vấn đề.

1

Sử dụng lệnh VimDIFF, điều này mang lại một bản trình bày đẹp về sự khác biệt

+1

Tôi thấy nó tốt hơn 'grep -F -f FILE2 FILE1' – Totalys