Skip to content

… karena “ketika terbagi maka masalah akan lebih mudah diselesaikan, meski lebih lama …”

Januari 22, 2013

“Divide et impera” (Julius Caesar)

Tadi pagi menjelang siang, tepatnya saat rapat hari Selasa yang “magis”, di pikiran DosGil berkecamuk sebuah permasalahan. Berarti DosGil tidak “ikut” rapat? Ikut dong, meski mungkin hanya raganya saja. SSSSssssttt jangan bilang-bilang kolega DosGil ya!!!! Masalah yang tidak penting itu terkait bagaimana mengubah binary bitstrings sejumlah 462 dalam baris menjadi kolom (transpose) dan kemudian mem-filter baris suatu file dengan memanfaatkan tiap baris hasil transpose untuk digunakan dalam bash script menggunakan awk dengan 462 sekuen. Masalah pertama terselesaikan dengan mudah karena binary hanya terdiri dari 0 dan 1, maka cukup dengan baris-baris perintah berikut:

sed “s/0/0\n/g” row-bitstrings_ref.pyplif.csv > col-bitstrings_ref.pyplif.tmp

sed “s/1/1\n/g” col-bitstrings_ref.pyplif.tmp > col-bitstrings_ref.pyplif.csv

rm col-bitstrings_ref.pyplif.tmp

Nah, yang kedua yang membingungkan karena berarti ada 2 variabel dan variabelnya masuk ke awk. Jika mungkin, sebenarnya DosGil ingin menggunakan perintah berikut:

for i in $(cat col-bitstrings_ref.pyplif.csv) AND for j in $(seq 1 426); do awk ‘{if (substr($4,$j,1)==$i) print \$0}’ no-ref_no-header_all.pyplif.csv > filtered.$j.txt; done

Tapi perintah tersebut error 🙂 Simply, karena memang dua variabel dengan for loop itu tidak sesederhana itu dan didalam awk ada variabel itu tricky. Atau yang betul adalah, DosGil tidak mengerti how to do it dalam single line.

Setelah rapat hari Selasa yang magis itu, DosGil tetap tidak meninggalkan ruangan meski digunakan oleh beberapa teman dan tamu undangan untuk pembagian tugas mengajar semester depan. Pembagian! DosGil tercerahkan saat itu. Alih-alih ngotot menggunakan single line maka DosGil membaginya menjadi multiple line executable shell script dengan didahului membuat semacam make script file yang membagi perintah di atas menjadi 3 bagian (3 kolom) dan menyatukan dengan perintah paste:  make_filtering.sh

#!/bin/sh
touch filter_col1.tmp
touch filter_col2.tmp
touch filter_col3.tmp

rm filter_col1.tmp
rm filter_col2.tmp
rm filter_col3.tmp

for i in $(seq 1 462)
do
echo “awk ‘{if (substr(\$4,$i,1)” >> filter_col1.tmp
done

for j in $(cat col-bitstrings_ref.pyplif.csv)
do
echo “==$j) print \$0}’ no-ref_no-header_all.pyplif.csv ” >> filter_col2.tmp
done

for q in $(seq 1 462)
do
echo “> filtered.$q.txt” >> filter_col3.tmp
done

paste -d”:” filter_col1.tmp filter_col2.tmp filter_col3.tmp > filter.tmp
sed “s/://g” filter.tmp > filter.sh
rm *.tmp
chmod u+x filter.sh

Sehingga filtering tinggal dilakukan dengan sebaris perintah berikut:

./filter.sh

Muter-muter munyer … Yup. Tapi setidaknya masih lebih otomatis daripada mengubah baris ke kolom dengan menekan tombol [enter] hingga 462 kali ataupun sebanyak 462 kali mengetikkan perintah seperti berikut:

 awk ‘{if (substr($4,1,1)==0) print $0}’ no-ref_no-header_all.pyplif.csv > filtered.1.txt

The most important things: It works and I’m happy!

*Pogung, 22 Januari 2013, 20:33 WIB

Iklan

From → Karena ..., Script

One Comment

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: