2010-10-16 27 views
5

tôi có 2 tác phẩm, là người đầu tiên chứa những điều sau đây:AWK/BASH: cách khớp một trường trong một tệp từ một trường trong một trường khác?

... 
John Allen Smith II 16 555-555-5555 10/24/2010 
John Allen Smith II 3 555-555-5555 10/24/2010 
John Allen Smith II 17 555-555-5555 10/24/2010 
John Doe 16 555-555-5555 10/24/2010 
Jane Smith 16 555-555-5555 9/16/2010 
Jane Smith 00 555-555-5555 10/24/2010 
... 

và tập tin thứ hai là danh sách các tên như vậy ...

... 
John Allen Smith II 
John Doe 
Jane Smith 
... 

Có thể sử dụng awk (hoặc bash khác lệnh) để in các dòng trong tệp đầu tiên khớp với bất kỳ tên nào trong tệp thứ hai (tên có thể lặp lại trong tệp đầu tiên)

Tiền thưởng? Có cách nào dễ dàng để loại bỏ những dòng lặp lại/trùng lặp trong tập tin đầu tiên?

Cảm ơn rất nhiều,

Tomek

+0

Nếu có 2 dòng bằng nhau, một dòng bị bỏ lại phía sau. Đó có phải là định nghĩa của bạn về "loại bỏ" dòng trùng lặp? – ghostdog74

Trả lời

3

awk

#! /bin/bash 
awk 'FNR==NR{!a[$0]++;next }{ b[$0]++ } 
END{ 
    for(i in a){ 
    for(k in b){ 
     if (a[i]==1 && i ~ k) { print i } 
    } 
    } 
}' file1 file2 
1

Bạn có thể sử dụng grep như:

grep -f file2 file1 # file2 is the file with the names. 

Tùy chọn -f của grep lấy mẫu được tìm kiếm từ các tập tin.

Để loại bỏ dòng bản sao chính xác từ đầu ra bạn có thể sử dụng sort như:

grep -f file2 file1 | sort -u 
+0

Tôi đã cố gắng sử dụng lệnh nhưng nhận được sau đây, "grep: Unmatched [hoặc [^", sau đó tôi đã thử sử dụng -F để buộc nhưng không có đầu ra? Lệnh này có sử dụng tất cả tệp 2 trong một mẫu tìm kiếm để thử và khớp với tệp 1 không? – Tomek

+0

Tôi đã chỉ định cờ -F sai (tôi đã thay thế -f bằng -F) để lệnh cuối cùng grep -f file2 -F file1 hoạt động. Cảm ơn đã giúp đỡ. – Tomek

+0

cho duy nhất, tôi đang tìm cách xóa các dòng khỏi tệp1 chỉ có tên lặp lại (các cột khác có dữ liệu khác nhau) – Tomek

1

mở rộng về câu trả lời codaddict của:

grep -f file2 file1 | sort | uniq 

này sẽ loại bỏ dòng là chính xác như nhau, nhưng tác dụng phụ (có thể là không mong muốn) là dat của bạn afile bây giờ sẽ được sắp xếp. Nó cũng yêu cầu các dòng là chính xác giống nhau, không phải là trường hợp trong dữ liệu ví dụ của bạn. Các tên giống nhau, nhưng dữ liệu sau những tên giống nhau thì khác nhau. uniq có thể sử dụng tùy chọn số trường hoặc ký tự, nhưng điều này sẽ không hoạt động trên dữ liệu của bạn vì tên của bạn có độ dài thay đổi và số lượng trường thay đổi. Nếu bạn biết trường dữ liệu của mình luôn là 3 trường cuối cùng trên một dòng, thì bạn có thể làm điều này:

grep -f file2 file1 | sort | rev | uniq -f 3 | rev 

đầu ra của bạn sẽ chỉ là một tên, nhưng cái nào? mức thấp nhất theo thứ tự từ điển bởi vì nó được sắp xếp (sort là cần thiết cho uniq để hoạt động bình thường). Nếu bạn không muốn sắp xếp nó đầu tiên, hoặc cần phải cẩn thận về những dòng được giảm xuống, sau đó một giải pháp awk hoặc perl hoặc ruby ​​hoặc python có lẽ sẽ làm việc tốt nhất bằng cách sử dụng mảng kết hợp.

+0

Yea đó chính xác là vấn đề của tôi. Tên có thể có độ dài thay đổi và dữ liệu sau tên khác nhau. Tôi chỉ tìm kiếm để có được sự xuất hiện đầu tiên của nói John Allen Smith II. Tôi sẽ xem xét một số mảng kết hợp với awk. Cảm ơn bạn về thông tin. – Tomek

Các vấn đề liên quan