Cách tìm dữ liệu trùng lặp trong tệp văn bản Linux với uniq | Học trực tuyến CNTT, học lập trình từ cơ bản đến nâng cao

Cách tìm dữ liệu trùng lặp trong tệp văn bản Linux với uniq

Chia sẻ kiến thức 11/03/2022

Nếu bạn có một tệp văn bản có nội dung trùng lặp mà bạn muốn xóa, đã đến lúc học cách sử dụng lệnh uniq.

Bạn đã bao giờ bắt gặp các tệp văn bản với các dòng và từ lặp lại chưa? Có thể bạn thường xuyên làm việc với đầu ra lệnh (command output) và muốn lọc chúng cho các chuỗi (string) riêng biệt. Khi nói đến tệp văn bản và loại bỏ dữ liệu thừa trong Linux, lệnh uniq là lựa chọn tốt nhất của bạn.

Trong bài viết này, chúng ta sẽ thảo luận về lệnh uniq, cùng với hướng dẫn chi tiết về cách sử dụng lệnh này để loại bỏ các dòng trùng lặp khỏi tệp văn bản.

Lệnh uniq là gì?

Lệnh uniq trong Linux được sử dụng để hiển thị các dòng giống hệt nhau trong tệp văn bản. Lệnh này có thể hữu ích nếu bạn muốn xóa các từ hoặc chuỗi trùng lặp khỏi tệp văn bản. Vì lệnh uniq so sánh các dòng liền kề để tìm các bản sao thừa, nó chỉ hoạt động với các tệp văn bản đã được sắp xếp.

May mắn là bạn có thể pipe* lệnh sort với uniq để sắp xếp tệp văn bản theo cách tương thích với lệnh. Ngoài việc hiển thị các dòng lặp lại, lệnh uniq cũng có thể đếm sự xuất hiện của các dòng trùng lặp trong tệp văn bản.

*pipe lấy output từ câu lệnh này và dùng nó làm input cho câu lệnh kế tiếp.

Cách sử dụng lệnh uniq

Có nhiều tùy chọn (option) và cờ (flag) khác nhau mà bạn có thể sử dụng với uniq. Một vài trong số đó khá cơ bản và thực hiện các thao tác đơn giản, trong khi một số khác dành cho người dùng nâng cao thường xuyên làm việc với các tệp văn bản trên Linux.

Cú pháp cơ bản

Cú pháp cơ bản của lệnh uniq là:

uniq option input output

… trong đó option là cờ được sử dụng để gọi các phương thức cụ thể của lệnh, input là tệp văn bản để xử lý và output là đường dẫn của tệp sẽ lưu trữ đầu ra.

Đối số(argument) output có thể được bỏ qua. Nếu người dùng không chỉ định tệp đầu vào, uniq sẽ lấy dữ liệu từ đầu ra chuẩn làm đầu vào. Điều này cho phép người dùng kết nối uniq với các lệnh Linux khác .

Tệp văn bản mẫu

Chúng ta sẽ sử dụng tệp văn bản Dupate.txt làm đầu vào cho lệnh.

127.0.0.1 TCP
127.0.0.1 UDP
Do catch this
DO CATCH THIS
Don't match this
Don't catch this
This is a text file.
This is a text file.
THIS IS A TEXT FILE.
Unique lines are really rare.

Lưu ý rằng chúng ta đã sắp xếp tệp văn bản này bằng lệnh sort. Nếu bạn đang làm việc với một số tệp văn bản khác, bạn có thể sắp xếp nó bằng lệnh sau:

sort filename.txt > sorted.txt

Xóa các dòng trùng lặp

Tính năng cơ bản nhất của uniq là loại bỏ các chuỗi lặp lại khỏi đầu vào và trả lại đầu ra duy nhất.

uniq duplicate.txt

Đầu ra:

hiển thị các dòng duy nhất uniq

Bạn có thể thấy hệ thống không hiển thị lần xuất hiện thứ hai của dòng This is a text file. Ngoài ra, lệnh nói trên chỉ hiển thị các dòng duy nhất trong tệp và không ảnh hưởng đến nội dung của tệp văn bản gốc.

Đếm các dòng lặp lại

Để xuất số dòng lặp lại trong tệp văn bản, hãy sử dụng cờ -c với lệnh mặc định.

uniq -c duplicate.txt

Đầu ra:

đếm các dòng lặp lại trong Linux

Hệ thống hiển thị số lượng từng dòng tồn tại trong tệp văn bản. Bạn có thể thấy rằng dòng This is a text file xuất hiện hai lần trong tệp. Theo mặc định, lệnh uniq có phân biệt chữ hoa chữ thường.

Để chỉ in các dòng trùng lặp từ tệp văn bản, hãy sử dụng cờ -D. -D là viết tắt của Duplicate (lặp lại).

uniq -D duplicate.txt

Hệ thống sẽ hiển thị đầu ra như sau.

This is a text file.
This is a text file.

Bỏ qua các trường trong khi kiểm tra các trường trùng lặp

Nếu bạn muốn bỏ qua một số trường nhất định trong khi so sánh các chuỗi, bạn có thể sử dụng cờ -f với lệnh. -F là viết tắt của Field (trường).

Hãy xem xét tệp văn bản sau fields.txt.

192.168.0.1 TCP
127.0.0.1 TCP
354.231.1.1 TCP
Linux FS
Windows FS
macOS FS

Để bỏ qua trường đầu tiên:

uniq -f 1 fields.txt

Đầu ra:

192.168.0.1 TCP
Linux FS

Lệnh nói trên đã bỏ qua trường đầu tiên (địa chỉ IP và tên hệ điều hành) và khớp (so sánh) từ thứ hai (TCP và FS). Sau đó, nó hiển thị lần xuất hiện đầu tiên của mỗi lần khớp dưới dạng đầu ra.

Bỏ qua các ký tự khi so sánh

Giống như bỏ qua các trường, bạn cũng có thể bỏ qua các ký tự. Cờ -s cho phép bạn chỉ định số ký tự cần bỏ qua trong khi khớp các dòng trùng lặp. Tính năng này hữu ích khi dữ liệu bạn đang làm việc với danh sách như sau:

1. First
2. Second
3. Second
4. Second
5. Third
6. Third
7. Fourth
8. Fifth

Để bỏ qua hai ký tự đầu tiên (số thứ tự danh sách) trong tệp list.txt:

uniq -s 2 list.txt

Đầu ra:

xóa các dòng trùng lặp khỏi danh sách

Trong kết quả đầu ra ở trên, hai ký tự đầu tiên bị bỏ qua và phần còn lại của chúng được so khớp để tìm ra các dòng duy nhất.

Kiểm tra số ký tự N đầu tiên để tìm trùng lặp

Cờ -w cho phép bạn chỉ kiểm tra một số ký tự cố định xem có trùng lặp không. Ví dụ:

uniq -w 2 duplicate.txt

Lệnh nói trên sẽ chỉ so sánh hai ký tự đầu tiên và sẽ in ra các dòng duy nhất nếu có.

Đầu ra:

khớp với một lượng ký tự cố định

Xóa phân biệt chữ hoa chữ thường

Như đã đề cập ở trên, uniq phân biệt chữ hoa chữ thường khi khớp các dòng trong tệp. Để bỏ qua trường hợp ký tự, hãy sử dụng tùy chọn -i với lệnh.

uniq -i duplicate.txt

Bạn sẽ thấy kết quả sau.

loại bỏ phân biệt chữ hoa chữ thường với uniq

Lưu ý trong kết quả đầu ra ở trên, uniq không hiển thị dòng DO CATCH THIS và THIS IS A TEXT FILE.

Gửi đầu ra tới tệp

Để gửi đầu ra của lệnh uniq đến một tệp, bạn có thể sử dụng ký tự Output Redirection (Chuyển hướng đầu ra) ( > ) như sau:

uniq -i duplicate.txt > otherfile.txt

Trong khi gửi đầu ra đến tệp văn bản, hệ thống không hiển thị đầu ra của lệnh. Bạn có thể kiểm tra nội dung của tệp mới bằng lệnh cat.

cat otherfile.txt

Phân tích dữ liệu trùng lặp với uniq

Trong khi quản lý các máy chủ Linux, phần lớn thời gian bạn sẽ làm việc trên terminal hoặc chỉnh sửa các tệp văn bản. Do đó, biết cách loại bỏ các bản sao dòng dư thừa trong tệp văn bản có thể là một kỹ năng cần có trong bộ kỹ năng Linux của bạn.

Dịch từ: https://www.makeuseof.com/how-to-find-duplicate-data-in-a-linux-text-file-with-uniq/

Vân Nguyễn

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, Q. Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        
Chat Button
FUNiX V2 GenAI Chatbot ×

yêu cầu gọi lại