Làm thế nào để chỉ in các giá trị trùng lặp từ một tệp văn bản?


69

Giả sử có một cột các giá trị số như sau:

Tệp1:

1 
2
3
3
3
4
4
4
5
6

Tôi muốn đầu ra:

3  
4

Đó là, chỉ các dòng lặp đi lặp lại. Có công cụ dòng lệnh nào để tìm ra điều này trong Linux không? (NB: Các giá trị được sắp xếp bằng số).


3
Xem man uniq.
jasonwryan

Liên quan, câu hỏi khó hơn: Xóa các dòng trùng lặp theo cặp
Wildcard

Câu trả lời:


118

Bạn có thể sử dụng uniq(1)cho việc này:

uniq -d file.txt

Điều này sẽ chỉ in ra các bản sao. Các tập tin đầu vào cần phải được sắp xếp sao cho tất cả các bản sao được liên tiếp (mà chúng có vẻ như vậy), vì vậy hãy chạy nó qua sắp xếp trước nếu không.


1
Nếu tôi muốn bộ ba chỉ được in thì sao?
MiNdFrEaK

8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'cho ba lần; thay thế "3" bằng bất kỳ N nào cho N-plicates
full.stack.ex

@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'cho ba lần

@camh bạn có thể làm điều này trên các tập tin csv không? chỉ các giá trị của một cột nhất định?
NumenorForLife

1
sắp xếp file.txt | uniq -d
ron

1

Sử dụng uniqawk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'

6
Công việc này, nhưng tôi không thấy lý do tại sao bạn dẫn đầu ra cat?
Bernhard

1
không phải ai cũng biết bạn có thể làm uniq -c File1và tương tự với nhiều công cụ khác. Đó có lẽ là những gì đang xảy ra ở đây.
Matthias

1

Thực hiện điều này: perl -ne 'print if $a{$_}++' filename.txt


Nó cung cấp 3\n3\n4\n\4ncho File1 đầu vào rõ ràng là sai.
yaegashi

snip perl tôi thấy mình đang xem lại cung cấp số lượng sự cố của mỗi dòng để nó có thể được dẫn, sắp xếp và lọc khi cần: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = mỗi% a) {printf "% d \ t% s", $ v, $ k}} 'tên tệp
Theophrastus

Có cách nào để làm điều đó trên một cột cụ thể được phân tách bằng dấu tách trường đã cho không?
Lão máu

Như được chỉ định bởi yaegashi, một bản sửa lỗi nhỏ là cần thiết để đáp ứng các yêu cầu: perl -ne 'print nếu 1 == $ a {$ _} ++' filename.txt Trong tất cả các câu trả lời, đó là câu trả lời yêu thích của tôi, bởi vì các câu trả lời khác yêu cầu xử lý trước tất cả các dữ liệu với một loại đầy đủ. Câu trả lời này bắt đầu kết quả đầu ra nhanh hơn và hiệu quả hơn.
BOC

0

uniq yêu cầu danh sách của bạn được sắp xếp, sắp xếp mặc định theo bảng chữ cái

sort | uniq -d path/to/your/filename

hoặc là

cat fileName | sort | uniq -d path/to/your/filename

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.