Di mana-mana saya melihat seseorang perlu mendapatkan daftar unik yang disortir, mereka selalu mengirim pesan sort | uniq
. Saya belum pernah melihat contoh di mana seseorang menggunakannya sort -u
. Kenapa tidak? Apa bedanya, dan mengapa lebih baik menggunakan uniq daripada bendera unik untuk disortir?
120
Jawaban:
sort | uniq
ada sebelumnyasort -u
, dan kompatibel dengan berbagai sistem yang lebih luas, meskipun hampir semua sistem modern mendukung-u
- itu POSIX. Ini sebagian besar merupakan kemunduran ke hari-hari ketikasort -u
tidak ada (dan orang-orang tidak cenderung mengubah metode mereka jika cara yang mereka tahu terus bekerja, lihat sajaifconfig
vsip
adopsi).Keduanya kemungkinan digabungkan karena menghapus duplikat dalam file memerlukan pengurutan (setidaknya, dalam kasus standar), dan merupakan kasus penggunaan yang sangat umum. Ini juga lebih cepat secara internal karena dapat melakukan kedua operasi pada saat yang sama (dan karena itu tidak memerlukan IPC antara
uniq
dansort
). Terutama jika file tersebut besar,sort -u
kemungkinan akan menggunakan lebih sedikit file perantara untuk mengurutkan data.Di sistem saya, saya secara konsisten mendapatkan hasil seperti ini:
Ini juga tidak menutupi kode kembali
sort
, yang mungkin penting (dalam kerang modern ada cara untuk mendapatkan ini, misalnya,bash
's$PIPESTATUS
array, tapi ini tidak selalu benar).sumber
sort | uniq
karena 9 kali dari 10, saya sebenarnya piping keuniq -c
.sort -u
itu adalah bagian dari UNIX Edisi ke-7, sekitar tahun 1979. Versisort
tanpa dukungan-u
benar-benar kuno - atau ditulis tanpa memperhatikan standar de facto sebelum standar de jure POSIX. Lihat juga Urutkan Stack Overflow & uniq di shell Linux dari 2010.ip
. Ini 2016 dan posting ini pada 2013, tetapi saya hanya tahu tentangip
perintah sekarang.uniq -c
" (dan mungkin memipis sekali lagi kesort -nr | head
) Saya bertanya-tanya apa yang setara dengansort | uniq
di Vim ketika saya tahu bahwa Vim memiliki:sort u
perintah. Dan TILsort -u
ada juga.sort -n | uniq
vssort -n -u
. Contohnya, trailing dan spasi putih terkemuka akan dianggap duplikat olehsort -n -u
tetapi tidak oleh yang sebelumnya!echo -e 'test \n test' | sort -n -u
mengembalikantest
, tetapiecho -e 'test \n test' | sort -n | uniq
mengembalikan kedua baris.Satu perbedaan adalah yang
uniq
memiliki sejumlah opsi tambahan yang berguna, seperti melewatkan bidang untuk perbandingan dan menghitung jumlah pengulangan suatu nilai.sort
's-u
bendera hanya mengimplementasikan fungsionalitas dari tanpa hiasanuniq
perintah.sumber
sort -u
tidak dapat diteruskanuniq
untuk menggunakan beberapa opsi berguna yang terakhir, seperti melewatkan bidang untuk perbandingan dan menghitung jumlah pengulangan."Dengan
sort
s dan s yang sesuai dengan POSIXuniq
(GNUuniq
saat ini tidak patuh dalam hal itu), ada perbedaan dalam hal itu yangsort
menggunakan algoritma penyatuan lokal untuk membandingkan string (biasanya akan digunakanstrcoll()
untuk membandingkan string) ketikauniq
memeriksa identitas nilai-byte (biasanya akan menggunakanstrcmp()
) .Itu penting setidaknya untuk dua alasan.
Di beberapa lokal, terutama pada sistem GNU, ada karakter berbeda yang mengurutkan yang sama. Misalnya, di lokal en_US.UTF-8 pada sistem GNU, semua ①②③④⑤⑥⑦⑧⑨⑩ ... karakter dan banyak lainnya mengurutkan yang sama karena urutan pengurutannya tidak ditentukan. Angka 0123456789 arabic mengurutkan sama dengan rekan-rekan mereka Indikator Arab Timur (٠١٢٣٤٥٦٧٨٩).
Sebab
sort -u
, ① mengurutkan sama dengan ② dan 0123 sama dengan ٠١٢٣ jadisort -u
hanya akan mempertahankan satu dari masing-masing, sedangkan untukuniq
(bukan GNUuniq
yang menggunakanstrcoll()
(kecuali dengan-i
)), ① berbeda dari ② dan 0123 berbeda dari ٠١٢٣, jadiuniq
akan mempertimbangkan semua 4 unik.strcoll
hanya dapat membandingkan string karakter yang valid (perilaku tidak terdefinisi sesuai POSIX ketika input memiliki urutan byte yang tidak membentuk karakter yang valid) sementarastrcmp()
tidak peduli tentang karakter karena hanya melakukan perbandingan byte ke byte. Jadi itulah alasan lain mengapasort -u
mungkin tidak memberikan Anda semua baris unik jika beberapa dari mereka tidak membentuk teks yang valid.sort|uniq
, sementara masih tidak ditentukan pada input non-teks, dalam praktiknya lebih cenderung memberi Anda garis unik karena alasan itu.Disamping mereka kehalusan, satu hal yang belum dicatat sejauh ini adalah bahwa
uniq
membandingkan seluruh baris leksikal, sedangkansort
's-u
membandingkan berdasarkan spesifikasi semacam diberikan pada baris perintah.sumber
Saya lebih suka menggunakan
sort | uniq
karena ketika saya mencoba menggunakan opsi-u
(menghilangkan duplikat) untuk menghapus duplikat yang melibatkan string case campuran, tidak mudah untuk memahami hasilnya.Catatan: sebelum Anda dapat menjalankan contoh di bawah ini, Anda perlu mensimulasikan urutan susunan standar C dengan melakukan hal berikut:
Sebagai contoh, jika saya ingin menyortir file dan menghapus duplikat, sementara pada saat yang sama, menjaga perbedaan kasus string.
Kebingungan ini diselesaikan dengan tidak menggunakan
-u
opsi untuk menghapus duplikat. Penggunaanuniq
lebih mudah diprediksi. Di bawah ini pertama-tama mengurutkan dan mengabaikan kasing dan kemudian meneruskannya keuniq
untuk menghapus duplikat.sumber
-u
opsisort
output yang pertama menjalankan sama (lihat halaman manual). Dengan demikiansort -fu
mengambil kemunculan pertama dari setiap baris unik yang tidak sensitif huruf. Logika yangsort
digunakan untuk menghapus duplikat dapat diprediksi.Perbedaan lain yang saya temukan hari ini adalah ketika menyortir berdasarkan delimeter di mana
sort -u
menerapkan flag unik hanya pada kolom yang Anda sortir.sumber