it-swarm-id.com

Bagaimana cara mendapatkan hanya hasil unik tanpa harus mengurutkan data?

$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

Hasil yang saya butuhkan adalah menampilkan semua baris dari file asli menghapus semua duplikat (bukan hanya yang berturut-turut), sambil mempertahankan urutan asli dari pernyataan dalam file.

Di sini, dalam contoh ini, hasil yang sebenarnya saya cari adalah

aaaaaa
cccccc
bbbbbb

Bagaimana saya bisa melakukan operasi uniq umum ini secara umum?

43
Lazer
Perl -ne 'print unless $seen{$_}++' data.txt

Atau, jika Anda harus memiliki penggunaan cat ):

cat data.txt | Perl -ne 'print unless $seen{$_}++'

Berikut terjemahan awk, untuk sistem yang tidak memiliki Perl:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
57
cjm

john memiliki alat bernama unique:

[email protected] % cat data.txt | unique out
[email protected] % cat out
aaaaaa
cccccc
bbbbbb

Untuk mencapai hal yang sama tanpa alat tambahan dalam satu commandline sedikit lebih kompleks:

[email protected] % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nl mencetak nomor baris di depan baris, jadi jika kita sort/uniq di belakangnya, kita dapat mengembalikan urutan asli dari baris tersebut. sed hanya menghapus nomor baris sesudahnya;)

13
binfalse

Saya lebih suka menggunakan ini:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n menambahkan nomor baris,

sort --key=2.1 -b -u mengurutkan pada bidang kedua (setelah nomor baris yang ditambahkan), mengabaikan baris awal, menjaga garis yang unik

sort -n mengurutkan dalam urutan angka yang ketat

cut -c8- menjaga semua karakter dari kolom 8 hingga EOL (mis., hilangkan nomor baris yang kami sertakan)

6
menkus

Perl memiliki modul yang dapat Anda gunakan yang mencakup fungsi yang disebut uniq. Jadi jika Anda ave data Anda dimuat dalam array di Perl Anda cukup memanggil fungsi seperti ini untuk membuatnya unik, namun tetap mempertahankan urutan aslinya.

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

Anda dapat membaca lebih lanjut tentang modul ini di sini: Daftar :: MoreUtils

2
slm