Berikut adalah perintah pada file acak dari pastebin :
wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
Halaman manual tidak jelas tentang apa yang dilakukan -u
bendera. Ada saran?
Jawaban:
Versi pendek:
uniq
, tanpa-u
, membuat setiap baris output menjadi unik.uniq -u
hanya mencetak setiap baris unik dari input .Versi yang sedikit lebih lama:
uniq
adalah untuk berurusan dengan file-file yang memiliki duplikat baris, dan hanya ketika baris-baris tersebut muncul berturut-turut dalam input. Jadi, untuk keperluannya, garis yang unik adalah yang tidak terduplikasi dengan segera.(
uniq
memiliki memori jangka pendek yang sangat terbatas; ia tidak akan pernah ingat apakah suatu baris muncul lebih awal pada input, kecuali jika itu adalah baris yang sebelumnya langsung - inilah mengapauniq
sangat sering dipasangkan dengansort
).Ketika bertemu dengan garis duplikat
uniq
,, tanpa-u
arg, mencetak satu salinan dari garis itu. (Ini membuat setiap baris output menjadi unik ).Dengan
-u
argumen itu, ia mencetak nol salinan dari garis itu - menjalankan duplikat hanya dihilangkan dari output.sumber
sort -u
sebagai gantisort | uniq
.uniq
melakukan normalisasi dan pengumpulan, ya. Tetapi meskipun demikian itu hanya pertimbangan lokal - Anda tahu di mana dalam output yang diurutkan garis akan muncul, dan hanya harus memilih mana dari beberapa baris yang berdekatan untuk disimpan. Jika input tidak diurutkan maka keputusan mempengaruhi seluruh operasi uniqifying, misalnya jika Anda akan menyimpan duplikat terakhir maka Anda tidak dapat menampilkan apa pun sampai Anda telah membaca baris terakhir dari input ...uniq
dengan-u
melompati setiap baris yang memiliki duplikat. Demikian:Biasanya,
uniq
mencetak garis paling banyak satu kali (dengan asumsi input diurutkan). Pilihan ini sebenarnya mencetak garis yang benar-benar unik (setelah tidak muncul lagi).sumber
uniq
bisa disebutdistinct
, karena ia mencetak semua garis yang berbeda, sedangkanuniq -u
mencetak semua garis yang unik.uniq
di beberapa lokal.uniq POSIX spec menggambarkannya dengan jelas:
-u
opsi buatuniq
untuk tidak mencetak garis yang berulang.Sebagian besar
uniq
implementasi menggunakan perbandingan byte, sedangkan GNUuniq
menggunakan urutan pemeriksaan untuk memfilter garis yang diduplikasi. Sehingga dapat menghasilkan hasil yang salah di beberapa lokal, misalnya dien_US.UTF-8
lokal:dan tidak
-u
memberi Anda garis:Jadi, Anda harus mengatur lokal
C
untuk mendapatkan perbandingan byte:sumber
uniq
(meskipun tampaknya maksud POSIX adalah bahwa ia harus melakukan perbandingan byte daripada strcoll () perbandingan seperti dalamsort -u
) sebagai lokal yang keliru ① menyortir sama dengan ②. Setidaknya GNUuniq
konsisten dengansort -u
.uniq
diperlukan untuk melakukan memcmp / strcmp sebagai lawan dari strcoll, itu tidak terlalu jelas bagi saya tapi itu untuk Geoff . Tentang lokal GNU yang memiliki ① pengurutan sama dengan ②, itu jelas bug karena tidak ada alasan mengapa mereka harus mengurutkan yang sama. Itu diizinkan oleh POSIX tetapi ada beberapa perubahan yang datang .normal:
uniq: tidak ada dua baris berulang berikutnya
disortir
sort -u: tidak ada dua baris yang berulang
sort / uniq: semuanya berbeda
menghitung kejadian berbeda
hanya baris yang tidak diulang (tidak diurutkan terlebih dahulu)
hanya garis yang tidak diulang (setelah disortir)
uniq -d: hanya mencetak garis duplikat, satu untuk setiap grup
.. dihitung
sumber