Giả sử tôi có một tệp tương tự như sau:
123
123
234
234
123
345
Tôi muốn tìm xem có bao nhiêu lần '123' được nhân đôi, bao nhiêu lần '234' được sao chép, v.v ... Thật lý tưởng, đầu ra sẽ như sau:
123 3
234 2
345 1
Giả sử tôi có một tệp tương tự như sau:
123
123
234
234
123
345
Tôi muốn tìm xem có bao nhiêu lần '123' được nhân đôi, bao nhiêu lần '234' được sao chép, v.v ... Thật lý tưởng, đầu ra sẽ như sau:
123 3
234 2
345 1
Câu trả lời:
Giả sử có một số trên mỗi dòng:
sort <file> | uniq -c
Bạn cũng có thể sử dụng --count
cờ dài hơn với phiên bản GNU, ví dụ: trên Linux:
sort <file> | uniq --count
sort
lại như sau:sort <file> | uniq -c | sort -n
Điều này sẽ chỉ in các dòng trùng lặp , với số lượng:
sort FILE | uniq -cd
hoặc, với các tùy chọn dài GNU (trên Linux):
sort FILE | uniq --count --repeated
trên BSD và OSX, bạn phải sử dụng grep để lọc ra các dòng duy nhất:
sort FILE | uniq -c | grep -v '^ *1 '
Đối với ví dụ đã cho, kết quả sẽ là:
3 123
2 234
Nếu bạn muốn in số lượng cho tất cả các dòng, kể cả những dòng chỉ xuất hiện một lần:
sort FILE | uniq -c
hoặc, với các tùy chọn dài GNU (trên Linux):
sort FILE | uniq --count
Đối với đầu vào đã cho, đầu ra là:
3 123
2 234
1 345
Để sắp xếp đầu ra với các dòng thường xuyên nhất ở trên, bạn có thể làm như sau (để có được tất cả kết quả):
sort FILE | uniq -c | sort -nr
hoặc, để chỉ nhận các dòng trùng lặp, thường xuyên nhất trước tiên:
sort FILE | uniq -cd | sort -nr
trên OSX và BSD, cái cuối cùng trở thành:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -n
hoặc | sort -nr
vào đường ống sẽ sắp xếp đầu ra theo số lần lặp lại (tăng dần hoặc giảm dần tương ứng). Đây không phải là những gì bạn đang hỏi nhưng tôi nghĩ nó có thể giúp ích.
| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
Thông qua ôi:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
Trong awk 'dups[$1]++'
lệnh, biến $1
giữ toàn bộ nội dung của cột1 và dấu ngoặc vuông là truy cập mảng. Vì vậy, đối với mỗi cột đầu tiên của dòng trong data
tệp, nút của mảng có tên dups
được tăng lên.
Và cuối cùng, chúng ta sẽ lặp qua dups
mảng với num
biến và in các số đã lưu trước sau đó số lượng giá trị trùng lặp của chúng theo dups[num]
.
Lưu ý rằng tệp đầu vào của bạn có khoảng trắng ở cuối một số dòng, nếu bạn xóa những dòng đó, bạn có thể sử dụng $0
thay cho $1
lệnh trên :)
uniq
sao?
sort | uniq
và giải pháp awk có sự đánh đổi hiệu suất & tài nguyên khá khác nhau: nếu các tệp lớn và số lượng dòng khác nhau nhỏ, giải pháp awk hiệu quả hơn rất nhiều. Nó là tuyến tính trong số lượng dòng và sử dụng không gian là tuyến tính trong số lượng dòng khác nhau. OTOH, giải pháp awk cần giữ tất cả các dòng khác nhau trong bộ nhớ, trong khi sắp xếp (GNU) có thể dùng đến các tệp tạm thời.
Trong các cửa sổ sử dụng "Windows PowerShell", tôi đã sử dụng lệnh được đề cập dưới đây để đạt được điều này
Get-Content .\file.txt | Group-Object | Select Name, Count
Ngoài ra, chúng ta có thể sử dụng Cmdlet của đối tượng where để lọc kết quả
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Giả sử bạn đã có quyền truy cập vào hệ vỏ Unix và / hoặc môi trường cygwin tiêu chuẩn:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
Về cơ bản: chuyển đổi tất cả các ký tự khoảng trắng thành các ngắt dòng, sau đó sắp xếp đầu ra được đặt và cung cấp dữ liệu đó thành uniq và đếm các dòng trùng lặp.