Anda dapat menggunakan perintah sort
dengan opsi --unique
:
sort -u input-file
Jika Anda ingin menulis hasil ke FILE alih-alih output standar, gunakan opsi --output=FILE
:
sort -u input-file -o output-file
Perintah uniq
juga bisa diterapkan. Dalam hal ini, baris yang identik harus konsekuensial, sehingga input harus diurutkan lebih awal - terima kasih kepada @RonJohn untuk catatan ini :
sort input-file | uniq > output-file
Saya suka sort
perintah untuk kasus serupa, karena kesederhanaannya, tetapi jika Anda bekerja dengan array yang besar, awk
pendekatan dari jawaban John1024 bisa lebih kuat. Berikut ini adalah perbandingan waktu antara pendekatan yang disebutkan, diterapkan pada file (berdasarkan contoh di atas) dengan hampir 5 juta baris:
$ cat input-file | wc -l
20000000
$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495
$ time sort input-file | uniq | wc -l
64
7.703
$ time awk '!a[$0]++' input-file | wc -l # from John1024's answer
64
1.271
$ time datamash rmdup 1 < input-file | wc -l # from αғsнιη's answer
64
0.770
Perbedaan signifikan lainnya adalah yang disebutkan oleh @Ruslan :
sort -u
hanya akan mencetak hasil setelah input berakhir, sementara awk
perintah ini akan mencetak setiap baris hasil baru dengan cepat (ini mungkin lebih penting untuk input yang disalurkan daripada file).
Berikut ini ilustrasi:
Dalam contoh di atas, loop (ditampilkan di bawah) menghasilkan 500 kombinasi acak, masing-masing dengan panjang tiga karakter, dari huruf AD. Kombinasi ini disalurkan ke awk
atau sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
sort input-file | uniq
!!!!Jika Anda ingin menjaga jalur output dalam urutan yang sama dengan jalur input, gunakan:
Bagaimana itu bekerja:
Ini menggunakan array asosiatif
a
untuk menghitung berapa kali setiap baris telah dilihat sebelumnya. Jika belum pernah terlihat sebelumnya, garis dicetak.sumber
awk
, tetapisort -u
merupakan cara yang mudah.sort -u
juga merupakan cara paling lambat :) Saya telah memperbarui jawaban saya dengan perbandingan waktu antara kedua pendekatan.sort -u
hanya akan mencetak hasil setelah input berakhir, sementaraawk
perintah ini akan mencetak setiap baris hasil baru dengan cepat (ini mungkin lebih penting untuk input yang disalurkan daripada file).awk
solusinya sangat bagus, walaupun tidak mudah dibacasort
.Anda dapat menggunakan GNU di
datamash
sini juga sebagai berikut, dan akan menjaga urutannya.sumber
time
perbandingan, ini adalah solusi tercepat, yang disediakan di sini.