Friday, September 30, 2011

AWK Part-1: Manipulasi sebuah file ASCII

Sebagai seorang Exploration Geoscientist, kita sering berhadapan dengan handling data yang cukup menantang.
Hal ini disebabkan karena ukuran data yang dihadapi sangat besar dengan jumlah baris dapat mencapai ribuan dan serta jumlah kolom mencapai jutaan.
Tentu saja data ini tidak bisa diatasi dengan software komersial seperti Microsoft Excell.

Pada bagian ini saya akan menjelaskan bagaimana memanipulasi sebuah file ASCII dengan AWK.


input.txt
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

1. output yang diharapkan tersususun atas kolom 2 kolom 2 dan kolom 3
awk '{print $2,$2,$3} ' input.txt > output.txt

more output.txt
2 2 3
2 2 3
2 2 3
2 2 3

2. output yang diharapkan harus memiliki ketelitian. Kolom 1 adalah integer, kolom 2 dan 3 ketelitian 2 di belakang koma.
awk '{printf "%.1d %.2f %.2f\n ",$2,$2,$3} ' input.txt > output.txt

more output.txt
2 2.00 3.00
2 2.00 3.00
2 2.00 3.00
2 2.00 3.00

3. Operasi matematika antara kolom 2 dengan sebuah angka, dalam hal ini adalah perkalian (*)
awk '{printf "%.1d %.2f %.2f\n ",$2,$2*100,$3} ' input.txt > output.txt

more output.txt
2 200.00 3.00
2 200.00 3.00
2 200.00 3.00
2 200.00 3.00

4. Operasi matematika antar kolom. Dalam hal ini, setiap elemen di kolom 2 dibagi elemen kolom 3
awk '{printf "%.1d %.2f %.2f\n ",$2,$2/$3,$3} ' input.txt > output.txt

more output.txt
2 0.67 3.00
2 0.67 3.00
2 0.67 3.00
2 0.67 3.00

5. Output tersusun dari baris 3 sampai baris 5
more input.txt
2.3 3.2 3.6
4.2 1.3 6.5
5.1 4.2 9.3
4.8 6.4 1.2
6.1 2.4 5.3
8.8 8.4 6.1
8.1 0.6 8.7

awk '(NR>2 && NR<6) {print $0} ' input.txt > output.txt

more output.txt
5.1 4.2 9.3
4.8 6.4 1.2
6.1 2.4 5.3

6. Memilih baris ganjil
awk 'NR%2 ' input.txt > output.txt

more output.txt
2.3 3.2 3.6
5.1 4.2 9.3
6.1 2.4 5.3
8.1 0.6 8.7

7. Memilih baris genap
awk '(NR+1)%2 ' input.txt > output.txt

more output.txt
4.2 1.3 6.5
4.8 6.4 1.2
8.8 8.4 6.1

8. Membalikkan susunan baris:
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] } ' input.txt > output.txt

more input.txt
2.3 3.2 3.6
4.2 1.3 6.5
5.1 4.2 9.3
4.8 6.4 1.2
6.1 2.4 5.3
8.8 8.4 6.1
8.1 0.6 8.7

more output.txt
8.1 0.6 8.7
8.8 8.4 6.1
6.1 2.4 5.3
4.8 6.4 1.2
5.1 4.2 9.3
4.2 1.3 6.5
2.3 3.2 3.6


9. Output diprint jika kolom 3 pada input lebih besar dari kolom 2
awk '$3 > $2 ' input.txt > output.txt

more output.txt
2.3 3.2 3.6
4.2 1.3 6.5
5.1 4.2 9.3
6.1 2.4 5.3
8.1 0.6 8.7

10. Menjumlahkan nilai-nilai pada setiap kolom
awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print s} ' input.txt > output.txt

11. Menjumlahkan semua nilai yang ada pada file
awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print s} ' input.txt

12. Print sampai baris ke 2
awk 'NR < 3 ' input.txt

simpan hasil output.txt

awk 'NR < 3 ' input.txt > output.txt

13. Output baris ke 5
awk 'NR==5 ' input.txt
awk 'NR==5 {print;exit} ' input.txt # lebih efisien untuk file yang besar

14. Berikut adalah contoh meng-outputkan data yang memiliki header serta tidak memiliki TAB pemisah antar kolom. Untuk membaca data seperti ini, kita dapat menggunakan FIELDWIDTHS. Untuk melewati header, dapat digunakan NR.

more input.txt
1Ini adalah header
2Ini adalah header
3Ini adalah header
4.2x1.3Wx1.8wddwd
5.3x4.24x4.1hywkw
6.7x1.2Rx1.6wdwd
12345678901234567

more output.txt
4.2 1.3 1.8
5.3 4.2 4.1
6.7 1.2 1.6


awk 'BEGIN{FIELDWIDTHS="3 1 3 2 3"} NR>3 && NR<7 {print $1,$3,$5}' input.txt > output.txt

FIELDWIDTHS="3 1 3 2 3" menunjukkan:
kolom 1: 3 karakter pertama (karakter 1-3)
kolom 2: 1 karakter berikutnya(karakter ke 4)
kolom 3: 3 karakter berikutnya(karakter 5-7)
...dst
NR>3 && NR<7 menunjukkan hanya meng-outputkan baris ke 4 sampai 6
{print $1,$3,$5} menunjukkan hanya print kolom 1, 3 dan 5

No comments: