Anda mungkin ingin melihat uniq
dan sort
aplikasi.
./yourscript.ksh | sortir | uniq
(FYI, ya, semacam itu diperlukan di baris perintah ini, uniq
hanya strip duplikat baris yang segera setelah satu sama lain)
EDIT:
Bertentangan dengan apa yang telah diposting oleh Aaron Digulla sehubungan dengan uniq
opsi commandline:
Diberikan input berikut:
kelas
botol
botol
botol
tempat sampah
tempat sampah
Jawa
uniq
akan menampilkan semua lini tepat sekali:
kelas
botol
tempat sampah
Jawa
uniq -d
akan menampilkan semua baris yang muncul lebih dari sekali, dan itu akan mencetaknya sekali:
botol
tempat sampah
uniq -u
akan menampilkan semua baris yang muncul tepat sekali, dan itu akan mencetaknya sekali:
kelas
Jawa
sort
menampilkan-u
versi untuk memberikan nilai unik juga.uniq
jahitan hanya memproses garis yang berdekatan (setidaknya secara default) yang berarti seseorang dapatsort
memasukkan sebelum makanuniq
.Ini sama dengan jawaban monoksida , tetapi sedikit lebih ringkas.
sumber
... | sort | uniq
karena dilakukan dalam satu kesempatanUntuk kumpulan data yang lebih besar di mana penyortiran mungkin tidak diinginkan, Anda juga dapat menggunakan skrip perl berikut:
Ini pada dasarnya hanya mengingat setiap output baris sehingga tidak menampilkannya lagi.
Ini memiliki keunggulan dibandingkan
sort | uniq
solusi " " karena tidak diperlukan penyortiran di muka.sumber
Dengan zsh Anda dapat melakukan ini:
Atau Anda dapat menggunakan AWK:
sumber
awk
(lihat stackoverflow.com/a/21200722/45375 untuk penjelasan) akan bekerja dengan file besar selama jumlah garis unik cukup kecil (karena garis unik disimpan dalam memori ). Thezsh
solusi membaca seluruh file ke dalam memori pertama, yang mungkin tidak menjadi pilihan dengan file besar. Juga, seperti yang ditulis, hanya garis-garis tanpa ruang tertanam yang ditangani dengan benar; untuk memperbaikinya, gunakanIFS=$'\n' read -d '' -r -A u <file; print -l ${(u)u}
saja.(IFS=$'\n' u=($(<infile)); print -l "${(u)u[@]}")
[@]
akhiran untuk referensi semua elemen array - tampaknya - setidaknya pada versi 5 - berfungsi tanpa itu; atau apakah Anda hanya menambahkannya untuk kejelasan?print -l "${(fu)$(<infile)}"
awk
output sampel juga.Pipa mereka melalui
sort
danuniq
. Ini menghapus semua duplikat.uniq -d
hanya memberikan duplikat,uniq -u
hanya memberikan yang unik (duplikat strip).sumber
uniq -u
BUKAN perilaku default (lihat edit dalam jawaban saya untuk detail)Dengan AWK yang dapat Anda lakukan, saya merasa lebih cepat daripada menyortir
sumber
Unik, seperti yang diminta, (tetapi tidak diurutkan);
menggunakan lebih sedikit sumber daya sistem untuk kurang dari ~ 70 elemen (sebagaimana diuji dengan waktu);
ditulis untuk mengambil input dari stdin,
(atau memodifikasi dan memasukkan skrip lain):
(Bash)
sumber
Saya mendapatkan kiat yang lebih baik untuk mendapatkan entri non-duplikat dalam file
sumber