Đôi khi, bạn có thể muốn kết hợp hai tệp theo cách mà đầu ra có ý nghĩa hơn. Ví dụ, có thể có một tệp chứa tên các châu lục và một tệp khác chứa tên các quốc gia nằm trong các châu lục này và yêu cầu là kết hợp cả hai tệp theo cách mà một châu lục và quốc gia tương ứng xuất hiện trên cùng một dòng.
Đó chỉ là một ví dụ - có thể có hàng trăm trường hợp sử dụng như vậy. Nếu bạn đang sử dụng Linux và đang tìm kiếm một công cụ có thể giúp bạn trong các tình huống này, bạn có thể muốn xem join, đây là một tiện ích dòng lệnh. Trong hướng dẫn này, chúng ta sẽ thảo luận về lệnh này bằng một số ví dụ dễ hiểu.
Xin lưu ý rằng tất cả các ví dụ được đề cập trong bài viết này đều đã được thử nghiệm trên Ubuntu 16.04 và phiên bản lệnh join mà chúng tôi sử dụng là 8.25.
Đây là nội dung trang hướng dẫn sử dụng nói về công cụ này:
Các ví dụ sau đây sẽ giúp bạn hiểu rõ hơn về cách lệnh join hoạt động.
và
Bây giờ, bạn có thể kết hợp hai tệp này theo cách sau:
Đây là đầu ra của lệnh trên trong trường hợp của chúng tôi:
việc kết hợp file1 và file2 sẽ không tạo ra bất kỳ đầu ra nào khác:
Đó là vì các dòng không thể ghép nối bị bỏ sót trong đầu ra. Tuy nhiên, nếu muốn, bạn vẫn có thể đưa chúng vào đầu ra bằng cách sử dụng tùy chọn dòng lệnh -a. Tùy chọn này yêu cầu bạn phải truyền số tệp để công cụ biết bạn đang nói đến tệp nào.
Ví dụ, trong trường hợp của chúng ta, lệnh sẽ là:
Vì vậy, bạn có thể thấy dòng không ghép nối từ tệp số 1 (trong trường hợp của chúng ta là file1) cũng được hiển thị trong đầu ra.
Lưu ý rằng trong trường hợp bạn chỉ muốn in các dòng không ghép nối (tức là, bỏ các dòng đã ghép nối trong đầu ra), bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh -v. Tùy chọn này hoạt động chính xác theo cách hoạt động của -a.
Sau đây là một ví dụ về tùy chọn -v:
Bây giờ, nếu bạn muốn trường thứ hai của mỗi dòng là trường chung để nối, bạn có thể cho công cụ biết điều này bằng cách sử dụng các tùy chọn dòng lệnh -1 và -2. Trong khi tùy chọn trước biểu thị tệp đầu tiên, tùy chọn sau tham chiếu đến tệp thứ hai. Các tùy chọn này yêu cầu một đối số số tham chiếu đến trường nối cho tệp tương ứng.
Ví dụ, trong trường hợp của chúng ta, lệnh sẽ là:
Và đây là đầu ra của lệnh này:
Lưu ý rằng trong trường hợp vị trí của trường chung giống nhau trong cả hai tệp (như trong ví dụ chúng ta vừa thảo luận, trong đó là 2), bạn có thể thay thế phần -1 [trường] -2 [trường] trong lệnh bằng -j [trường]. Vì vậy, trong trường hợp của chúng ta, lệnh sẽ trở thành:
join -j2 file1 file2
file1
file2
Bây giờ, nếu bạn thử join hai tệp này, sử dụng trường chung mặc định (đầu tiên), sẽ không có gì xảy ra. Đó là vì trường hợp của các phần tử trường trong cả hai tệp là khác nhau. Để join bỏ qua vấn đề trường hợp này, hãy sử dụng tùy chọn dòng lệnh -i.
Đây là lệnh cho trường hợp của chúng ta:
Và ảnh chụp màn hình sau đây cho thấy lệnh đang hoạt động:
Bây giờ, trong trường hợp bạn muốn lỗi/cảnh báo này biến mất, bạn có thể thực hiện bằng tùy chọn --nocheck-order. Đây là lệnh tương tự, nhưng với tùy chọn này được bật:
Vì vậy, bạn có thể thấy lệnh join không kiểm tra đầu vào được sắp xếp lần này.
Đó chỉ là một ví dụ - có thể có hàng trăm trường hợp sử dụng như vậy. Nếu bạn đang sử dụng Linux và đang tìm kiếm một công cụ có thể giúp bạn trong các tình huống này, bạn có thể muốn xem join, đây là một tiện ích dòng lệnh. Trong hướng dẫn này, chúng ta sẽ thảo luận về lệnh này bằng một số ví dụ dễ hiểu.
Xin lưu ý rằng tất cả các ví dụ được đề cập trong bài viết này đều đã được thử nghiệm trên Ubuntu 16.04 và phiên bản lệnh join mà chúng tôi sử dụng là 8.25.
Lệnh join Linux
Lệnh join cho phép bạn kết hợp các dòng của hai tệp trên một trường chung.
Mã:
join [OPTION]... FILE1 FILE2
Mã:
Đối với mỗi cặp dòng đầu vào có trường join giống hệt nhau, hãy viết một dòng đến đầu ra chuẩn.
Trường
join mặc định là trường đầu tiên, được phân cách bằng khoảng trắng. Khi FILE1 hoặc FILE2 (không phải cả hai) là -, hãy đọc đầu vào chuẩn.
1. Làm thế nào để kết hợp các dòng tệp bằng lệnh join?
Chúng ta hãy cùng tìm hiểu cách sử dụng cơ bản của lệnh join. Giả sử có hai tệp (file1 và file2) chứa các dòng sau:
Mã:
1. Châu Á:
2. Châu Phi:
3. Châu Âu:
4. Bắc Mỹ:
Mã:
1. Ấn Độ
2. Nigeria
3. Hà Lan
4. Hoa Kỳ
Mã:
join file1 file2
2. Làm thế nào để lệnh join in ra các dòng không thể ghép nối?
Theo mặc định, lệnh join chỉ in ra các dòng có thể ghép nối. Ví dụ, ngay cả khi file1 chứa một trường bổ sung (dòng số 5):
Mã:
1. Châu Á:
2. Châu Phi:
3. Châu Âu:
4. Bắc Mỹ:
5. Nam Mỹ:
Đó là vì các dòng không thể ghép nối bị bỏ sót trong đầu ra. Tuy nhiên, nếu muốn, bạn vẫn có thể đưa chúng vào đầu ra bằng cách sử dụng tùy chọn dòng lệnh -a. Tùy chọn này yêu cầu bạn phải truyền số tệp để công cụ biết bạn đang nói đến tệp nào.
Ví dụ, trong trường hợp của chúng ta, lệnh sẽ là:
Mã:
join file1 file2 -a 1
Vì vậy, bạn có thể thấy dòng không ghép nối từ tệp số 1 (trong trường hợp của chúng ta là file1) cũng được hiển thị trong đầu ra.
Lưu ý rằng trong trường hợp bạn chỉ muốn in các dòng không ghép nối (tức là, bỏ các dòng đã ghép nối trong đầu ra), bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh -v. Tùy chọn này hoạt động chính xác theo cách hoạt động của -a.
Sau đây là một ví dụ về tùy chọn -v:
3. Làm thế nào để cung cấp các trường liên kết tùy chỉnh?
Như chúng ta đã biết, liên kết sẽ kết hợp các dòng tệp trên một trường chung, theo mặc định là trường đầu tiên. Tuy nhiên, nếu muốn, bạn có thể chỉ định một trường khác nhau cho mỗi tệp. Ví dụ, hãy xem xét các nội dung sau trong file1 và file2 tương ứng.
Mã:
* 1. Châu Á:
& 2. Châu Phi:
@ 3. Châu Âu:
# 4. Bắc Mỹ:
Mã:
# 1. Ấn Độ
@ 2. Nigeria
& 3. Hà Lan
* 4. Hoa Kỳ
Ví dụ, trong trường hợp của chúng ta, lệnh sẽ là:
Mã:
join -1 2 -2 2 file1 file2
Lưu ý rằng trong trường hợp vị trí của trường chung giống nhau trong cả hai tệp (như trong ví dụ chúng ta vừa thảo luận, trong đó là 2), bạn có thể thay thế phần -1 [trường] -2 [trường] trong lệnh bằng -j [trường]. Vì vậy, trong trường hợp của chúng ta, lệnh sẽ trở thành:
join -j2 file1 file2
4. Làm thế nào để lệnh join không phân biệt chữ hoa chữ thường?
Theo mặc định, lệnh join phân biệt chữ hoa chữ thường. Ví dụ, hãy xem xét các tệp sau:file1
Mã:
A. Châu Á:
B. Châu Phi:
C. Châu Âu:
D. Bắc Mỹ:
Mã:
a. Ấn Độ
b. Nigeria
c. Hà Lan
d. Hoa Kỳ
Đây là lệnh cho trường hợp của chúng ta:
Mã:
join -i file1 file2
5. Làm thế nào để join không kiểm tra đầu vào đã sắp xếp?
Theo mặc định, lệnh join kiểm tra xem đầu vào đã cung cấp có được sắp xếp hay không và báo cáo nếu không. Ví dụ, hãy xem xét đầu ra sau khi thông tin trong file1 không được sắp xếp:Bây giờ, trong trường hợp bạn muốn lỗi/cảnh báo này biến mất, bạn có thể thực hiện bằng tùy chọn --nocheck-order. Đây là lệnh tương tự, nhưng với tùy chọn này được bật:
Vì vậy, bạn có thể thấy lệnh join không kiểm tra đầu vào được sắp xếp lần này.