Tìm các dòng độc đáo


90

Làm cách nào để tìm các dòng duy nhất và xóa tất cả các dòng trùng lặp khỏi tệp? Tệp đầu vào của tôi là

1
1
2
3
5
5
7
7

Tôi muốn kết quả là:

2
3

sort file | uniqsẽ không thực hiện công việc. Sẽ hiển thị tất cả các giá trị 1 lần


17
Tập tin phải được sắp xếp trước. sort file | uniq -usẽ xuất ra bảng điều khiển cho bạn.
ma77c

Tôi nghĩ lý do sort file | uniqhiển thị tất cả các giá trị 1 lần là vì nó ngay lập tức in dòng mà nó gặp phải lần đầu tiên và đối với những lần gặp tiếp theo, nó chỉ bỏ qua chúng.
Reeshabh Ranjan

Câu trả lời:


88

uniq có tùy chọn bạn cần:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3

32
Đảm bảo rằng bạn sắp xếp nếu các mục trong tệp hoặc chưa được sắp xếp. sắp xếp tệp.txt | uniq
user3885927 13/09/16

xem câu trả lời của tôi nếu bạn không muốn sắp xếp trước. stackoverflow.com/a/54803217/5441945
hychou

28

Sử dụng như sau:

sort < filea | uniq > fileb

2
Điều này không chính xác, tôi nghĩ ý bạn là:uniq -u filea > fileb
Chris Seymour

1
Tôi sao chép dữ liệu của bạn và chạy nó và nó hoạt động: sort<filea.txt | uniq>fileb.txt. Có thể bạn đã bỏ qua các tiện ích mở rộng. Tôi đang sử dụng Mac OS X. bạn phải đi từ filea.txtmột số khácfileb.txt
kasavbere

Không cần chuyển hướng sortvà điểm của đường ống là gì uniqkhi bạn chỉ có thể làm sort -u file -o filenhững gì bạn đang làm là xóa các giá trị trùng lặp tức là filebchứa 1,2,3,5,7OP của bạn chỉ muốn các dòng duy nhất được 2,3và đạt được bằng uniq -u filephần mở rộng tệp không có gì với nó, câu trả lời của bạn là sai.
Chris Seymour

12

Bạn cũng có thể in ra giá trị duy nhất trong "tệp" bằng cách sử dụng catlệnh bằng cách chuyển đến sortuniq

cat file | sort | uniq -u


9

uniq -u đã khiến tôi phát điên vì nó không hoạt động.

Vì vậy, thay vì điều đó, nếu bạn có python (hầu hết các bản phân phối và máy chủ Linux đã có nó):

Giả sử bạn có tệp dữ liệu trong notUnique.txt

#Python
#Assuming file has data on different lines
#Otherwise fix split() accordingly.

uniqueData = []
fileData = open('notUnique.txt').read().split('\n')

for i in fileData:
  if i.strip()!='':
    uniqueData.append(i)

print uniqueData

###Another option (less keystrokes):
set(open('notUnique.txt').read().split('\n'))

Lưu ý rằng do các dòng trống, tập hợp cuối cùng có thể chứa chuỗi ký tự '' hoặc chỉ dấu cách. Bạn có thể xóa nó sau. Hoặc chỉ cần sao chép từ thiết bị đầu cuối;)

#

Just FYI, Từ trang uniq Man:

"Lưu ý: 'uniq' không phát hiện các dòng lặp lại trừ khi chúng ở gần nhau. Bạn có thể muốn sắp xếp đầu vào trước hoặc sử dụng 'sort -u' mà không có 'uniq'. Ngoài ra, các phép so sánh tuân theo các quy tắc được chỉ định bởi 'LC_COLLATE'."

Một trong những cách đúng, để gọi với: # sort nonUnique.txt | uniq

Chạy ví dụ:

$ cat x
3
1
2
2
2
3
1
3

$ uniq x
3
1
2
3
1
3

$ uniq -u x
3
1
3
1
3

$ sort x | uniq
1
2
3

Dấu cách có thể được in, vì vậy hãy chuẩn bị!


3
Đây là quá mức cần thiết.
SmallChess

9

Mặc dù sortmất O (n log (n)) thời gian, tôi thích sử dụng

awk '!seen[$0]++'

awk '!seen[$0]++'là viết tắt của awk '!seen[$0]++ {print}'dòng in (= $ 0) nếu seen[$0]không phải là số 0. Nó mất nhiều không gian hơn nhưng chỉ O (n) thời gian.


7

bạn có thể dùng:

sort data.txt| uniq -u

điều này sắp xếp dữ liệu và lọc theo các giá trị duy nhất



3

uniqnên làm tốt nếu tệp của bạn là / có thể được sắp xếp, nếu bạn không thể sắp xếp tệp vì một số lý do, bạn có thể sử dụng awk:

awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'


3
sort -d "file name" | uniq -u

điều này đã làm việc cho tôi cho một cái tương tự. Sử dụng cái này nếu nó không được sắp xếp. Bạn có thể xóa sắp xếp nếu nó được sắp xếp


1

Tôi thấy điều này dễ dàng hơn.

sort -u input_filename > output_filename

-u viết tắt của độc đáo.


0

Đây là lần đầu tiên tôi thử

skilla:~# uniq -u all.sorted  

76679787
76679787 
76794979
76794979 
76869286
76869286 
......

Sau khi thực hiện một con mèo -e all.sorted

skilla:~# cat -e all.sorted 
$
76679787$
76679787 $
76701427$
76701427$
76794979$
76794979 $
76869286$
76869286 $

Mỗi dòng thứ hai có một khoảng trắng :( Sau khi xóa tất cả các khoảng trắng, nó vẫn hoạt động!

cảm ơn bạn

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.