Thursday, October 6, 2011

AWK Part-3: Advanced & Miscellaneous

1. Mengulangi setiap baris beberapa kali (4 kali)
more input.txt
2.3 3.2 3.6
4.2 1.3 6.5
5.1 4.2 9.3

more output.txt
2.3 3.2 3.6
2.3 3.2 3.6
2.3 3.2 3.6
2.3 3.2 3.6
4.2 1.3 6.5
4.2 1.3 6.5
4.2 1.3 6.5
4.2 1.3 6.5
5.1 4.2 9.3
5.1 4.2 9.3
5.1 4.2 9.3
5.1 4.2 9.3

awk '{ for (i = 1; i <=4 ; i++) print }' input.txt > output.txt

Dengan Bourne Shell

#!/bin/sh
max=4
while read line
do
n=1
while [ $n -le $max ]
do
echo "$line"
n=$((n+1))
done
done < input.txt > output.txt


2. Mengulangi setiap baris sejumlah bilangan yang berada pada kolom pertama

more input.txt
3 2.3 3.2 3.6
2 4.2 1.3 6.5
5 5.1 4.2 9.3

Untuk contoh ini, baris pertama akan diulangi 3 kali, baris kedua 2 kali dan baris ketiga 5 kali.

more output.txt
3 2.3 3.2 3.6
3 2.3 3.2 3.6
3 2.3 3.2 3.6
2 4.2 1.3 6.5
2 4.2 1.3 6.5
5 5.1 4.2 9.3
5 5.1 4.2 9.3
5 5.1 4.2 9.3
5 5.1 4.2 9.3
5 5.1 4.2 9.3


Copy kode berikut lalu berinama apasaja.sh

#!/bin/sh
awk 'BEGIN{
}
{
for(i=0;i<$1;i++) print
}
END {
}' $1


Ubah permission dengan: chmod +x apasaja.sh (atau chmod 777 filename)
dengan ls -l :
sebelum chmod +x
-rw-r--r-- 1 agus agus 64 2011-10-06 05:23 apasaja.sh
setelah chmod +x
-rwxr-xr-x 1 agus agus 64 2011-10-06 05:23 apasaja.sh

Untuk menjalankan kode di atas:
sh apasaja.sh input.txt > output.txt

3. Membandingkan dua file dengan kolom pertama dan kolom kedua sebagai acuan. Baris dari file kedua di-outputkan jika kolom pertama dan kedua pada file1 sama dengan kolom pertama dan kedua pada file2.

more file1
-4.2 1.0 18.12 13.78 0.36 0.56 0.001
-3.8 9.0 24.02 18.91 0.41 0.48 0.001
-0.5 3.3 19.06 16.84 0.29 0.12 0.003

more file2
-3.8 9.0 -1.78172 11.3782 0.01 0.01 0.01 31704
-0.5 3.3 -1.83964 11.2841 0.01 0.01 0.01 31701
-2.3 3.6 -1.82152 11.3152 0.01 0.01 0.01 31702
-7.2 1.0 -1.80205 11.3466 0.01 0.01 0.01 31703
-2.0 3.6 -1.76099 11.4199 0.01 0.01 0.01 31705
29.9 3.2 -1.74029 11.4417 0.01 0.01 0.01 31706

more output.txt
-3.8 9.0 -1.78172 11.3782 0.01 0.01 0.01 31704
-0.5 3.3 -1.83964 11.2841 0.01 0.01 0.01 31701

awk 'FNR==NR{A[$1,$2]=1;next} A[$1,$2]' file1 file2 > output.txt


4. Memilih elemen dan menjadikannya sebagai variabel.

more input.txt
3 2.3 3.2 3.6
2 4.2 1.3 6.5
5 5.1 4.2 9.3

Copy kode berikut lalu berinama kode.sh

#!/bin/sh
angka=`awk 'FNR == 2 {print $3}' < input.txt`
echo elemen tersebut adalah: $angka
kali=`echo "$angka * 2.0" | bc -l`
echo elemen tersebut dikali 2 = $kali


sh kode.sh
elemen tersebut adalah: 1.3
elemen tersebut dikali 2 = 2.60


Perhatikan bahwa simbol acute (`) mengapit semua perintah yang mengoutputkan variabel.
Perintah bc -l di atas digunakan untuk memanggil basic calculator (bc) dengan menggunakan long precision (-l).
Anda dapat mencoba mengetikkan bc -l pada terminal linux untuk menjadikannya sebagai kalkulator.


5. Menggabungkan beberapa proses, contoh berikut adalah memilih baris ganjil lalu mengkalikannya dengan 0.001

awk 'NR%2 ' input.txt | awk '{for(i=1;i <=NF;++i)$i*=0.001;print}' > output.txt


more input.txt
3 2.3 3.2 3.6
2 4.2 1.3 6.5
5 5.1 4.2 9.3


more output.txt
0.003 0.0023 0.0032 0.0036
0.005 0.0051 0.0042 0.0093


6. Berbagai perintah Unix yang berguna untuk Geoscientist
more input.txt
3 2.3 3.2 3.6
2 4.2 1.3 6.5
5 5.1 4.2 9.3

menampilkan 2 baris pertama dari sebuah file: head -2 input.txt
3 2.3 3.2 3.6
2 4.2 1.3 6.5

menampilkan 2 baris terakhir dari sebuah file: tail -2 input.txt
2 4.2 1.3 6.5
5 5.1 4.2 9.3

7. ps -ef | grep agus menampilkan semua proses lalu menseleksinya yang mengandung nama agus

agus 1959 1 0 04:39 ? 00:00:17 mono /us
agus 1969 1874 2 04:41 pts/1 00:03:15 gedit program1.sh
agus 3999 1874 0 07:11 pts/1 00:00:00 ps -ef

Lalu saya ingin meng-kill program gedit: kill -9 1969

8. Untuk melihat aktifitas cpu: top
Perintah top cukup penting untuk memonitor proses berat seperti migrasi data seismik

agus@agus-Satellite-M305:~/programming$ top

Swap: 6416380k total, 0k used, 6416380k free, 634416k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1862 agus 20 0 246m 56m 22m S 16 1.5 18:44.44 plugin-containe
994 root 20 0 83804 38m 15m S 13 1.0 12:14.39 Xorg
1625 agus 20 0 91760 14m 10m S 9 0.4 0:43.72 gnome-terminal
1402 agus 20 0 157m 5680 4472 S 8 0.1 5:26.83 pulseaudio



plugin-containe memakan 16% dari CPU

9. mengurutkan file dari yang paling kecil sampai besar: ls -alSr -h

10. Mengecek kapasitas hard disk df -k -h .

agus@agus-Satellite-M305:~/programming$ df -k -h .
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 56G 13G 40G 24

11. Menghitung jumlah baris dalam sebuah file: wc -l filename
12. Melihat isi file: more filename

13. Left(-) and Right(+) Justify

head file
A    1    1    0.32
AB    123    123    -0.122
ABC    1234    1234    0.12
AB    1234    1234    3.12
A    12    12    131.11
Q    3    1    34.1211


awk '{printf  "%-3s %-4d %5d %6.2f\n ",$1,$2,$3,$4}' file | awk '{ sub(/^[ \t]+/, ""); print }'
A   1       1   0.32
AB  123   123  -0.12
ABC 1234 1234   0.12
AB  1234 1234   3.12
A   12     12 131.11
Q   3       1  34.12


Col1: left, allocate 3 digits skip 1 digit to the next col
Col2: left, allocate 4 digits skip 1 digit to the next col
Col3: right, allocate 5 digits skip 2 digits to the next col
col4: right, allocate 6 digits with 2 precission
awk '{ sub(/^[ \t]+/, ""); print }' remove unwanted space


14. Mengulang nilai-nilai dalam baris beberapa kali sesuai angka pada kolom 2
copy perintah berikut lalu beri nama ulang.sh
#!/bin/sh
awk 'BEGIN{ } { for(i=0;i < $2;i++) print } END { }' $1

Jalankan dengan perintah
sh ulang.sh filein > fileout

15. Menghilangkan space pada kolom
awk '{ sub(/^[ \t]+/, ""); print }'


16. Mengganti kata foo dengan bar pada sebuah file
awk '{ sub(/foo/,"bar"); print }'

17. Mengambil semua nilai yang berada pada kolom ke 3 dari file2 berdasarkan kesamaan pada kolom 1 dari file1 dan file2

more file2
64102910 15.0 586659.8 9207540.2  29.3 141131430
64062913 15.0 586809.7 9207379.9  31.1 141133218
63972911 15.0 586709.3 9207019.5  29.2 141134059
more file1
64102910    1  132 2890 6332 6463
64102910  133  264 2897 6332 6463
64102910  265  396 2904 6332 6463
awk 'NR==FNR{a[$1]=$3;next;}{print $0 "    " ($1 in a ? a[$1] : "NA")}' file2 file1 | head -3
64102910    1  132 2890 6332 6463    586659.8
64102910  133  264 2897 6332 6463    586659.8
64102910  265  396 2904 6332 6463    586659.8
awk 'NR==FNR{a[$1]=$3;next;}{print $1 "    " ($1 in a ? a[$1] : "NA")}' file2 file1 | head -3
64102910    586659.8
64102910    586659.8
64102910    586659.8

18. Sorting dan mengoutputkan yang uniq
awk '{print $4}' | sort | uniq


19.Compare two files based on col 1 print match and non-match

head file1
514151    utr5    0    +
512281    utr5    0    +
512281    utr5    0    +
512281    utr5    0    +


head file2
514151    utr5    0    +
512281    utr5    0    +
512288    utr5    0    +
512289    utr5    0    +


awk 'NR==FNR{a[$1]=$1;next}!a[$1]' file1 file2
512288    utr5    0    +
512289    utr5    0    +


 

awk 'NR==FNR{a[$1]=$1;next}a[$1]' file1 file2
514151    utr5    0    +
512281    utr5    0    +

No comments: