Nếu bạn là người dùng dòng lệnh Linux và công việc của bạn liên quan đến việc xử lý các tệp văn bản, bạn nên biết (nếu chưa biết) rằng có nhiều tiện ích dòng lệnh có thể giúp ích rất nhiều cho bạn trong các tình huống khác nhau. Ví dụ, có một công cụ có tên là 'uniq' báo cáo hoặc thậm chí xóa các dòng lặp lại trong một tệp.
Trong bài viết này, chúng ta sẽ thảo luận về 'uniq' thông qua các ví dụ dễ hiểu. Nhưng trước khi làm điều đó, cần đề cập rằng tất cả các ví dụ và hướng dẫn được đề cập trong hướng dẫn này đều đã được thử nghiệm trên Ubuntu 16.04LTS.
uniq [OPTION]... [INPUT [OUTPUT]]
Theo trang hướng dẫn của tiện ích: "Lọc các dòng khớp liền kề từ INPUT (hoặc đầu vào chuẩn), ghi vào OUTPUT (hoặc đầu ra chuẩn). Nếu không có tùy chọn, các dòng khớp sẽ được hợp nhất với lần xuất hiện đầu tiên."
Sau đây là một số ví dụ giúp bạn hiểu rõ hơn về công cụ này.
Rõ ràng, mỗi dòng được lặp lại. Bây giờ hãy chạy Uniq trên tệp này và xem điều gì xảy ra.
Như bạn thấy, đầu ra mà lệnh tạo ra không chứa các dòng lặp lại. Xin lưu ý rằng tệp gốc - 'file1' trong trường hợp của chúng ta - vẫn không bị ảnh hưởng. Bạn có thể chuyển hướng đầu ra của công cụ sang tệp khác trong trường hợp bạn muốn lưu và làm việc trên đó.
tạo ra kết quả đầu ra sau:
Như bạn có thể thấy, số lần lặp lại cho mỗi dòng được thêm tiền tố trước nó trong đầu ra.
Bây giờ, khi tôi chạy lệnh sau:
Đầu ra sau được tạo ra:
Như bạn thấy, tùy chọn -D khiến uniq hiển thị tất cả các dòng được lặp lại trong đầu ra, bao gồm tất cả các lần lặp lại của chúng. Để phân tách tốt hơn, bạn có thể để một dòng trống sau mỗi nhóm các dòng được lặp lại, điều này có thể thực hiện được bằng cách sử dụng tùy chọn --all-repeated.
uniq --all-repeated[=METHOD] file1
Tùy chọn này yêu cầu người dùng nhập tên phương thức. Các giá trị có thể là prepend (để thêm dòng trống) hoặc separate (để thêm một dòng trống). Ví dụ, đây là tùy chọn này khi sử dụng phương thức prepend.
Tiếp tục, nếu bạn muốn công cụ chỉ hiển thị một dòng trùng lặp cho mỗi nhóm, thì bạn có thể sử dụng tùy chọn -d. Sau đây là một ví dụ về tùy chọn đó:
Rõ ràng, chỉ có một dòng lặp lại từ mỗi nhóm được hiển thị trong đầu ra.
Bây giờ, giả sử các dòng được coi là giống nhau hoặc khác nhau dựa trên trường thứ hai của chúng (HTF hoặc FF) và bạn muốn truyền tải điều này đến uniq, thì điều này có thể được thực hiện bằng tùy chọn dòng lệnh -f.
Tùy chọn -f yêu cầu bạn truyền một số biểu thị số trường bạn muốn lệnh bỏ qua. Ví dụ, trong trường hợp của chúng ta, chúng ta có thể truyền '1' làm đối số cho -f vì đây chỉ là trường đầu tiên mà chúng ta muốn uniq bỏ qua.
Đầu ra cho thấy rõ ràng rằng uniq coi cả dòng đầu tiên và dòng thứ ba là lặp lại dựa trên trường thứ hai tương ứng của chúng.
Đây là một ví dụ:
Lưu ý rằng tùy chọn -f mà chúng ta đã thảo luận trong phần trước.
Vì vậy, trong trường hợp của chúng ta:
uniq -u file1
Đây là một ví dụ:
Lưu ý rằng tùy chọn -f mà chúng ta đã thảo luận trong phần/điểm số 4.
uniq -s [number-of-char] filename
Ví dụ, giả sử tệp chứa các dòng sau:
Bây giờ, nếu bạn muốn uniq bỏ qua 4 ký tự đầu tiên trong mỗi dòng trước khi so sánh, thì bạn có thể thực hiện theo cách sau:
uniq -s 4 file1
Đây là lệnh trên đang hoạt động:
Vì vậy, bạn có thể thấy rằng dòng thứ tư (faq_forge) ban đầu đã bị bỏ qua trong đầu ra. Điều này là do sau khi bỏ qua bốn ký tự đầu tiên, dòng thứ ba và thứ tư giống nhau và do đó được coi là lặp lại bởi uniq.
uniq -w [num-of-chars] [file-name]
Ví dụ, giả sử tệp chứa các dòng sau:
Bây giờ, nếu yêu cầu là giới hạn phép so sánh trong 3 ký tự đầu tiên, thì điều này có thể được thực hiện theo cách sau:
uniq -w 3 file1
Đây là lệnh trên đang hoạt động:
Vì 3 ký tự đầu tiên của dòng thứ ba và thứ tư giống nhau, nên các dòng này được coi là lặp lại. Do đó, chỉ có kết quả thứ ba được hiển thị trong đầu ra.
Ví dụ, hãy xem xét cùng một trường hợp mà chúng ta đã thảo luận ở phần trước, chỉ là dòng thứ tư bắt đầu bằng chữ hoa H, O và W.
Bây giờ, nếu bạn thử chạy cùng một lệnh mà chúng ta đã sử dụng ở phần trước, bạn sẽ thấy đầu ra khác:
Đó là vì ba ký tự đầu tiên của dòng thứ ba và thứ tư khác nhau đối với uniq do chữ hoa của chúng. Trong các trường hợp dòng này, bạn có thể làm cho phép so sánh không phân biệt chữ hoa chữ thường bằng cách sử dụng tùy chọn dòng lệnh -i.
uniq -z [file-name]
Trong bài viết này, chúng ta sẽ thảo luận về 'uniq' thông qua các ví dụ dễ hiểu. Nhưng trước khi làm điều đó, cần đề cập rằng tất cả các ví dụ và hướng dẫn được đề cập trong hướng dẫn này đều đã được thử nghiệm trên Ubuntu 16.04LTS.
Lệnh Linux Uniq
Như đã đề cập ở phần đầu, lệnh uniq báo cáo hoặc bỏ qua các dòng lặp lại. Đây là cú pháp chung của lệnh này:uniq [OPTION]... [INPUT [OUTPUT]]
Theo trang hướng dẫn của tiện ích: "Lọc các dòng khớp liền kề từ INPUT (hoặc đầu vào chuẩn), ghi vào OUTPUT (hoặc đầu ra chuẩn). Nếu không có tùy chọn, các dòng khớp sẽ được hợp nhất với lần xuất hiện đầu tiên."
Sau đây là một số ví dụ giúp bạn hiểu rõ hơn về công cụ này.
1. Cách xóa các dòng lặp lại bằng lệnh uniq
Giả sử tệp chứa các dòng sau:Rõ ràng, mỗi dòng được lặp lại. Bây giờ hãy chạy Uniq trên tệp này và xem điều gì xảy ra.
Mã:
uniq file1
Như bạn thấy, đầu ra mà lệnh tạo ra không chứa các dòng lặp lại. Xin lưu ý rằng tệp gốc - 'file1' trong trường hợp của chúng ta - vẫn không bị ảnh hưởng. Bạn có thể chuyển hướng đầu ra của công cụ sang tệp khác trong trường hợp bạn muốn lưu và làm việc trên đó.
2. Cách hiển thị số lần lặp lại cho mỗi dòng
Nếu muốn, bạn cũng có thể yêu cầu uniq hiển thị số lần lặp lại của một dòng trong đầu ra. Điều này có thể được thực hiện bằng cách sử dụng tùy chọn dòng lệnh -c. Ví dụ, lệnh sau:
Mã:
uniq -c file1
Như bạn có thể thấy, số lần lặp lại cho mỗi dòng được thêm tiền tố trước nó trong đầu ra.
3. Cách chỉ in các dòng trùng lặp bằng uniq
Để uniq chỉ in các dòng trùng lặp, hãy sử dụng tùy chọn dòng lệnh -D. Ví dụ, giả sử file1 hiện chứa một dòng thừa ở cuối (lưu ý rằng dòng này không được lặp lại).Bây giờ, khi tôi chạy lệnh sau:
Mã:
uniq -D file1
Như bạn thấy, tùy chọn -D khiến uniq hiển thị tất cả các dòng được lặp lại trong đầu ra, bao gồm tất cả các lần lặp lại của chúng. Để phân tách tốt hơn, bạn có thể để một dòng trống sau mỗi nhóm các dòng được lặp lại, điều này có thể thực hiện được bằng cách sử dụng tùy chọn --all-repeated.
uniq --all-repeated[=METHOD] file1
Tùy chọn này yêu cầu người dùng nhập tên phương thức. Các giá trị có thể là prepend (để thêm dòng trống) hoặc separate (để thêm một dòng trống). Ví dụ, đây là tùy chọn này khi sử dụng phương thức prepend.
Tiếp tục, nếu bạn muốn công cụ chỉ hiển thị một dòng trùng lặp cho mỗi nhóm, thì bạn có thể sử dụng tùy chọn -d. Sau đây là một ví dụ về tùy chọn đó:
Rõ ràng, chỉ có một dòng lặp lại từ mỗi nhóm được hiển thị trong đầu ra.
4. Cách làm cho uniq tránh so sánh một vài trường đầu tiên
Đôi khi, tùy thuộc vào tình huống, mức độ giống nhau của hai dòng được xác định bởi một phần nhỏ trong số các dòng đó. Ví dụ, hãy xem xét nội dung của tệp sau:Bây giờ, giả sử các dòng được coi là giống nhau hoặc khác nhau dựa trên trường thứ hai của chúng (HTF hoặc FF) và bạn muốn truyền tải điều này đến uniq, thì điều này có thể được thực hiện bằng tùy chọn dòng lệnh -f.
Mã:
uniq -f [number-of-fields-to-skip] [file-name]
Mã:
uniq -f 1 file1
Đầu ra cho thấy rõ ràng rằng uniq coi cả dòng đầu tiên và dòng thứ ba là lặp lại dựa trên trường thứ hai tương ứng của chúng.
5. Cách để uniq hiển thị tất cả các dòng, đồng thời phân tách các nhóm lặp lại bằng một dòng trống
Trong trường hợp yêu cầu là hiển thị tất cả các dòng, đồng thời phân tách các nhóm lặp lại bằng một dòng trống, thì bạn có thể sử dụng tùy chọn --group. Giống như tùy chọn --all-repeated mà chúng ta đã thảo luận trước đó, --group cũng yêu cầu bạn phải cho biết vị trí của dòng trống (prepend, append hoặc both).Đây là một ví dụ:
Lưu ý rằng tùy chọn -f mà chúng ta đã thảo luận trong phần trước.
6. Cách để uniq chỉ in các dòng không lặp lại
Như bạn đã hiểu, theo mặc định, lệnh uniq chỉ hiển thị các dòng lặp lại trong đầu ra. Nhưng nếu muốn, bạn có thể chỉ hiển thị các dòng không lặp lại hoặc duy nhất. Bạn có thể thực hiện thao tác này bằng tùy chọn dòng lệnh -u.
Mã:
uniq -u [file-name]
uniq -u file1
Đây là một ví dụ:
Lưu ý rằng tùy chọn -f mà chúng ta đã thảo luận trong phần/điểm số 4.
7. Cách làm cho uniq tránh so sánh số lượng ký tự đầu tiên đã đặt
Trong một trong những ví dụ trước đó, chúng ta đã thảo luận về cách bạn có thể làm cho uniq bỏ qua các trường. Tuy nhiên, nếu muốn, bạn có thể buộc công cụ bỏ qua một số ký tự đầu tiên. Có thể truy cập tính năng này bằng tùy chọn dòng lệnh -s.uniq -s [number-of-char] filename
Ví dụ, giả sử tệp chứa các dòng sau:
Bây giờ, nếu bạn muốn uniq bỏ qua 4 ký tự đầu tiên trong mỗi dòng trước khi so sánh, thì bạn có thể thực hiện theo cách sau:
uniq -s 4 file1
Đây là lệnh trên đang hoạt động:
Vì vậy, bạn có thể thấy rằng dòng thứ tư (faq_forge) ban đầu đã bị bỏ qua trong đầu ra. Điều này là do sau khi bỏ qua bốn ký tự đầu tiên, dòng thứ ba và thứ tư giống nhau và do đó được coi là lặp lại bởi uniq.
8. Cách giới hạn phép so sánh ở số ký tự cố định
Tương tự như cách bạn bỏ qua các ký tự, bạn cũng có thể yêu cầu uniq giới hạn phép so sánh ở số ký tự cố định. Để thực hiện điều này, bạn sẽ phải sử dụng tùy chọn dòng lệnh -w.uniq -w [num-of-chars] [file-name]
Ví dụ, giả sử tệp chứa các dòng sau:
Bây giờ, nếu yêu cầu là giới hạn phép so sánh trong 3 ký tự đầu tiên, thì điều này có thể được thực hiện theo cách sau:
uniq -w 3 file1
Đây là lệnh trên đang hoạt động:
Vì 3 ký tự đầu tiên của dòng thứ ba và thứ tư giống nhau, nên các dòng này được coi là lặp lại. Do đó, chỉ có kết quả thứ ba được hiển thị trong đầu ra.
9. Cách làm cho phép so sánh uniq không phân biệt chữ hoa chữ thường
Theo mặc định, phép so sánh mà uniq thực hiện có bản chất phân biệt chữ hoa chữ thường. Tuy nhiên, bạn có thể làm cho quy trình không phân biệt chữ hoa chữ thường bằng cách sử dụng tùy chọn dòng lệnh -i.Ví dụ, hãy xem xét cùng một trường hợp mà chúng ta đã thảo luận ở phần trước, chỉ là dòng thứ tư bắt đầu bằng chữ hoa H, O và W.
Bây giờ, nếu bạn thử chạy cùng một lệnh mà chúng ta đã sử dụng ở phần trước, bạn sẽ thấy đầu ra khác:
Đó là vì ba ký tự đầu tiên của dòng thứ ba và thứ tư khác nhau đối với uniq do chữ hoa của chúng. Trong các trường hợp dòng này, bạn có thể làm cho phép so sánh không phân biệt chữ hoa chữ thường bằng cách sử dụng tùy chọn dòng lệnh -i.
10. Làm thế nào để tạo đầu ra uniq kết thúc bằng NUL
Theo mặc định, đầu ra mà uniq tạo ra là kết thúc bằng dòng mới. Tuy nhiên, nếu muốn, bạn có thể có đầu ra kết thúc bằng NUL thay thế (hữu ích khi xử lý uniq trong các tập lệnh). Điều này có thể thực hiện được bằng cách sử dụng tùy chọn dòng lệnh -z.uniq -z [file-name]