2012-11-07 33 views
5

Tìm cách thực hiện kết nối bên trong trên hai tệp văn bản khác nhau. Về cơ bản tôi đang tìm kiếm tương đương bên trong tham gia của chương trình tham gia GNU. Có một điều như vậy tồn tại? Nếu không, giải pháp awk hoặc sed sẽ hữu ích nhất, nhưng lựa chọn đầu tiên của tôi sẽ là lệnh Linux.Kết nối bên trong trên hai tệp văn bản

Dưới đây là một ví dụ về những gì tôi đang tìm cách để làm

tập 1:

0|Alien Registration Card LUA|Checklist Update 
1|Alien Registration Card LUA|Document App Plan 
2|Alien Registration Card LUA|SA Application Nbr 
3|Alien Registration Card LUA|tmp_preapp-DOB 
0|App - CSCE Certificate LUA|Admit Type 
1|App - CSCE Certificate LUA|Alias 1 
2|App - CSCE Certificate LUA|Alias 2 
3|App - CSCE Certificate LUA|Alias 3 
4|App - CSCE Certificate LUA|Alias 4 

tập 2:

Alien Registration Card LUA 

Kết quả:

0|Alien Registration Card LUA|Checklist Update 
1|Alien Registration Card LUA|Document App Plan 
2|Alien Registration Card LUA|SA Application Nbr 
3|Alien Registration Card LUA|tmp_preapp-DOB 

Trả lời

5

nên không tệp 2 chứa LUA ở cuối?

Nếu có, bạn vẫn có thể sử dụng join:

join -t'|' -12 <(sort -t'|' -k2 file1) file2 
+0

Cảm ơn bạn! Có nó nên (Tôi đã cập nhật câu hỏi). Tôi không biết rằng một trong những có thể bao ra và nuôi kết quả đó trở lại thông qua stdin. Khá hữu dụng! –

+0

@DaveSnigier: Bạn luôn có thể tạo tệp tạm thời, nhưng Quy trình thay thế ngắn hơn nhiều so với loại. – choroba

0

Bạn có thể sử dụng dán lệnh để kết hợp file:

paste [option] source files [>destination file] 

ví dụ của bạn nó sẽ là

paste file1.txt file2.txt >result.txt 
+0

Đóng, nhưng dán sẽ chỉ tham gia vào số dòng của hai tệp.Tôi thực sự muốn tham gia vào một trường trong tệp thay thế. –

5

Bạn có thể sửa đổi tập lệnh này:

cat file2 | while read line; do 
    grep $line file1 # or whatever you want to do with the $line variable 
done 

trong khi vòng lặp đọc dòng tệp2 theo dòng và cung cấp dòng đó cho lệnh grep greps dòng đó trong tệp1. Có một số đầu ra thêm có thể bị loại bỏ bằng các tùy chọn grep.

+0

Rất thông minh! Tôi sẽ có thể tìm thấy nhiều công dụng cho mẫu này ngoài vấn đề trước mắt này –

+2

Đừng quên trích dẫn '$ line'. Nếu nó chứa không gian, nó có thể được mở rộng nặng. Ngoài ra, nếu bạn đang tìm kiếm chuỗi kết hợp cố định thay vì cụm từ thông dụng (hãy nhớ, đó là gREp), sau đó sử dụng tùy chọn '-F'. – ghoti

+2

Đây chỉ là một diễn giải không hiệu quả của [anwer] này (http://stackoverflow.com/a/13278763/874188) bởi @glennjackman. (Một, 'grep' được đọc trong các mẫu và sau đó kiểm tra tệp đích chỉ một lần là hiệu quả hơn nhiều so với chạy một' grep' cho mỗi mẫu, đặc biệt là đối với các đầu vào lớn. – tripleee

5

Dưới đây là một lựa chọn awk, vì vậy bạn có thể tránh được sự phụ thuộc bash (cho tính di động):

$ awk -F'|' 'NR==FNR{check[$0];next} $2 in check' file2 file1 

làm việc như thế này?

  • -F'|' - bộ tách lĩnh vực
  • 'NR==FNR{check[$0];next} - nếu tổng số kỷ lục khớp với con số kỷ lục tập tin (ví dụ: chúng ta đang đọc các tập tin đầu tiên được cung cấp), sau đó chúng tôi cư một mảng và tiếp tục.
  • $2 in check - Nếu trường thứ hai được đề cập trong mảng chúng tôi đã tạo, in dòng (đó là hành động mặc định nếu không có hành động nào được cung cấp).
  • file2 file1 - các tệp. Đơn đặt hàng rất quan trọng do cấu trúc NR==FNR.
4

Hình như bạn chỉ cần

grep -F -f file2 file1 
Các vấn đề liên quan