Temukan garis unik

90

Bagaimana cara menemukan baris unik dan menghapus semua duplikat dari file? File masukan saya adalah

1
1
2
3
5
5
7
7

Saya ingin hasilnya:

2
3

sort file | uniqtidak akan melakukan pekerjaan itu. Akan menampilkan semua nilai 1 kali

amprantino.dll
sumber
17
File tersebut harus diurutkan terlebih dahulu. sort file | uniq -uakan menampilkan konsol untuk Anda.
ma77c
Saya pikir alasan sort file | uniqmenunjukkan semua nilai 1 kali adalah karena segera mencetak garis yang ditemuinya pertama kali, dan untuk pertemuan berikutnya, itu hanya melewatinya.
Reeshabh Ranjan

Jawaban:

88

uniq memiliki opsi yang Anda butuhkan:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3
Lev Levitsky
sumber
32
Pastikan Anda melakukan sortir apakah entri dalam file tersebut sudah terurut atau belum. urutkan file.txt | uniq
pengguna3885927
lihat jawaban saya jika Anda tidak ingin melakukan sortir dulu. stackoverflow.com/a/54803217/5441945
hychou
28

Gunakan sebagai berikut:

sort < filea | uniq > fileb
kasavbere
sumber
2
Ini tidak benar, saya pikir maksud Anda:uniq -u filea > fileb
Chris Seymour
1
Saya menyalin data dan menjalankannya dan bekerja: sort<filea.txt | uniq>fileb.txt. Mungkin Anda meninggalkan ekstensi. Saya menggunakan Mac OS X. Anda harus beralih dari yang filea.txtlainfileb.txt
kasavbere
Tidak perlu untuk pengalihan dengan sortdan apa gunanya perpipaan uniqketika Anda bisa melakukan sort -u file -o fileapa yang Anda lakukan adalah menghapus nilai duplikat yaitu Anda filebberisi 1,2,3,5,7OP hanya menginginkan baris unik yang 2,3dan dicapai oleh uniq -u fileekstensi File tidak memiliki apa-apa dengan itu, jawaban Anda salah.
Chris Seymour
12

Anda juga dapat mencetak nilai unik dalam "file" menggunakan catperintah dengan menyalurkan ke sortdanuniq

cat file | sort | uniq -u

skywardcode
sumber
9

uniq -u membuatku gila karena tidak berhasil.

Jadi, alih-alih itu, jika Anda memiliki python (sebagian besar distro dan server Linux sudah memilikinya):

Dengan asumsi Anda memiliki file data di 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'))

Perhatikan bahwa karena baris kosong, set terakhir mungkin berisi string '' atau hanya spasi. Anda dapat menghapusnya nanti. Atau langsung saja menyalin dari terminal;)

#

FYI saja, Dari halaman Man uniq:

"Catatan: 'uniq' tidak mendeteksi baris yang berulang kecuali jika berdekatan. Anda mungkin ingin mengurutkan input terlebih dahulu, atau menggunakan 'sort -u' tanpa 'uniq'. Selain itu, perbandingan menghormati aturan yang ditentukan oleh 'LC_COLLATE'."

Salah satu cara yang benar, untuk memanggil dengan: # sort nonUnique.txt | uniq

Contoh run:

$ 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

Spasi mungkin dicetak, jadi bersiaplah!

ashmew2
sumber
3
Ini berlebihan.
SmallChess
9

Sementara sortmembutuhkan waktu O (n log (n)), saya lebih suka menggunakan

awk '!seen[$0]++'

awk '!seen[$0]++'adalah singkatan dari awk '!seen[$0]++ {print}', print line (= $ 0) jika seen[$0]bukan nol. Dibutuhkan lebih banyak ruang tetapi hanya O (n) waktu.

hychou
sumber
7

kamu bisa memakai:

sort data.txt| uniq -u

ini mengurutkan data dan memfilter berdasarkan nilai unik

lebih hitam
sumber
4

uniq -u < file akan melakukan pekerjaan itu.

Shiplu Mokaddim
sumber
Tidak perlu pengalihan.
Chris Seymour
Ya saya tahu. Apakah itu biasa
Shiplu Mokaddim
3

uniqseharusnya baik-baik saja jika file Anda sedang / dapat diurutkan, jika Anda tidak dapat mengurutkan file karena alasan tertentu, Anda dapat menggunakan awk:

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


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

ini berhasil bagi saya untuk yang serupa. Gunakan ini jika tidak diatur. Anda dapat menghapus sortir jika sudah diatur

a_rookie_seeking_answers
sumber
3

Saya merasa ini lebih mudah.

sort -u input_filename > output_filename

-u singkatan unik.

Anant Mittal
sumber
0

Ini yang pertama saya coba

skilla:~# uniq -u all.sorted  

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

Setelah melakukan cat -e all.sorted

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

Setiap baris kedua memiliki spasi tambahan :( Setelah menghapus semua spasi tambahan, ini berfungsi!

Terima kasih

amprantino.dll
sumber