Sunday, February 19, 2017

Uniq with perl

Sort uniq command

Bagi pengguna linux khususnya yang terbiasa beroperasi dengan shell, program uniq sepertinya sudah tidak asing lagi. Seperti arti dari kata uniq "unique", yaitu tidak ada duanya "cuma satu-satunya yang seperti itu", program ini bisa digunakan untuk menghilangkan duplikasi baris pada file. Untuk menghilangkan duplikasi baris, bisa dilakukan dengan command seperti pada gambar.

Pada gambar command uniq digunakan untuk menghilangkan duplikasi pada file yang berisi baris seperti ini :
AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFF
AAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAA


Terdapat beberapa duplikasi baris, misal baris dengan huruf A tertulis sebanyak 4 kali. Setelah eksekusi command maka duplikasi menghilang begitu saja "clink.. dan jadi sulapan". Lalu, apakah semua itu terjadi dengan wajarnya? apakah semua itu terjadi karena program uniq mempunyai ilmu hitam yang bisa menghilangkan sesuatu? Tentu tidak kawan.


Oke, sekarang mari sedikit saja membuat program sederhana untuk menghilangkan duplikasi baris dengan menggunakan perl. Pertama kita membutuhkan sebuah fungsi untuk membuka file pada program seperti berikut :
open my $handle, '<', $ARGV[0];
chomp(my @lines = <$handle>);
close $handle;

Setelah array baris file didapat, selanjutnya dilakukan seleksi terhadap baris untuk filtering. Untuk melakukan filtering, digunakan trik melalui array khusus/hash. Data tipe hash ini merupakan array seperti pada umumnya, hanya saja array ini menggunakan key dan value. Berikut penerapan pada program :
my %hash = ();
foreach $line (@lines){
    my $oldval = $hash{$line}++;
    if($oldval eq 0){
        print $line."\n";
    }
}

Buat hash dengan menggunakan baris pada file, kemudian jika nilai variable oldval 0, maka baris belum terduplikasi.
Plus di belakang variabel artinya ambil nilai baru increment. Jadi hasil increment ini akan menjadi nilai value dan baris file menjadi keynya. Jika value 0 berarti belum pernah dilakukan operasi increment pada key atau baris file.

Full code 

Hasil eksekusi

Sudah diketahui apa yang terjadi ketika sebuah hash dilakukan increment dan hanya akan diambil hash dengan nilai awal 0, maka dengan hal tersebut, code bisa lebih disederhanakan menjadi seperti berikut :




~~ clink.. dan hilang..