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 | uniq
sẽ không thực hiện công việc. Sẽ hiển thị tất cả các giá trị 1 lần
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 | uniq
sẽ không thực hiện công việc. Sẽ hiển thị tất cả các giá trị 1 lần
sort file | uniq
hiể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.
Câu trả lời:
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
Sử dụng như sau:
sort < filea | uniq > fileb
uniq -u filea > fileb
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.txt
một số khácfileb.txt
sort
và điểm của đường ống là gì uniq
khi bạn chỉ có thể làm sort -u file -o file
những gì bạn đang làm là xóa các giá trị trùng lặp tức là fileb
chứa 1,2,3,5,7
OP của bạn chỉ muốn các dòng duy nhất được 2,3
và đạt được bằng uniq -u file
phần mở rộng tệp không có gì với nó, câu trả lời của bạn là sai.
Bạn cũng có thể in ra giá trị duy nhất trong "tệp" bằng cách sử dụng cat
lệnh bằng cách chuyển đến sort
vàuniq
cat file | sort | uniq -u
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ó):
#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'))
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
$ 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
uniq -u < file
sẽ thực hiện công việc.
uniq
nê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}'
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
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.
Đâ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
sort file | uniq -u
sẽ xuất ra bảng điều khiển cho bạn.