Monday, November 7, 2011

Unix untuk Geoscientists

Unix memiliki ratusan fungsi yang sangat berguna untuk mendukung pekerjaan seorang geoscientist. Tetapi pada kenyataannya, hanya sebagian kecil yang termanfaatkan.

Hal ini mungkin karena terbatasnya pengetahuan, keenganan atau beranggapan bahwa Unix sebagai suatu yang rumit.

Sebagian perintah Unix telah saya jelaskan di sini. Untuk memudahkan memahami perintah Unix yang lainnya, saya jelaskan berdasarkan contoh-contoh berikut:

man
manual dari perintah sebuah fungsi, untuk keluar dari man tekan q

man tee
NAME
tee - read from standard input and write to standard output and files

SYNOPSIS
tee [OPTION]... [FILE]...

Buatlah dua file yang berisi angka-angka dengan perintah seq. Pada terminal Linux ketik seq 1 1 5 > file1 lalu enter dan seq 2 2 10 > file2 lalu enter.

Cek kedua file
more file1
1
2
3
4
5

more file2
2
4
6
8
10

paste
menggabungkan dua file
paste file1 file2 > file3
more file3
1 2
2 4
3 6
4 8
5 10


cut
mengekstrak bagian dari data i.e. kolom, karakter, dll.
cut -f 1,2 file3
1 2
2 4
3 6
4 8
5 10

cut -f 2 file3
2
4
6
8
10

sort
men-sorting baris-baris dari file
sort -n file1
1
2
3
4
5

sort -r file1
5
4
3
2
1

Buat file4 sbb:
more file4
1 5
2 4
3 3
4 2
5 1

sort -k 2 file4
5 1
4 2
3 3
2 4
1 5


wc
menghitung jumlah baris (-l), jumlah kata (-w) dan jumlah karakter (-c)
wc -l file4
5 file4 .....ada 5 baris dalam file4

cat
concatenate file
cat file1 file2 > file5

more file5
1
2
3
4
5
2
4
6
8
10

uniq
membuang atau memprint nilai yang sama

more file5
1
2
2
3
4
4
5
6
8
10

uniq -u file5
1
3
5
6
8
10

uniq -d file5
2
4

grep
print-out berdasarkan karakter atau kata tertentu
more file5
1
2
2
3
4
4
5
6
8
10


grep '2' file5
2
2

sed -e 's/2/20/g' file5
1
20
20
3
4
4
5
6
8
10

sed '5,10 w junk1' file5 (perintah print baris ke 5 s/d 10 dari file5).
more junk1
4
4
5
6
8
10

tac
mengurutkan secara terbalik
tac file5
10
8
6
5
4
4
3
2
2
1

head
menampilkan bagian awal sebuah file
head -3 file5
1
2
2

tail
menampilkan bagian akhir dari file
tail -3 file5
6
8
10

fold
membatasi jumlah karakter perbaris

contoh berikut membatasi hanya 12 karakter dari file yang bernama test
fold -w 12 test
Fold ' is a
Unix command
used for ma
king a file
with long li


tee
printout di screen dan file secara sekaligus

which
adalah perintah untuk mengetahui lokasi perintah yang bisa dieksekusi

which surange
/home/akmal/seismic_unix/bin/surange

history
printout perintah yang telah dipakai di terminal
history > junk
more junk
1 gv modelfile.eps
2 sh psmerge1a.sh
3 ls
4 gv psmerge1a.eps
5 gv modelfile.eps
6 sh raytracing.sh

Kombinasi berbagai perintah
Contoh: hanya meng-output-kan satu kali dari duplikasi yang terjadi pada kolom2

more input.txt
1 3 2
3 1 7
5 3 4
2 1 1
3 1 4
5 3 6
2 3 8
2 2 8
2 2 5

more output.txt
2 1 1
2 2 5
1 3 2


sort -k 2n < input.txt| awk -F\ '{ print NR, $0, count[$2]++ }' | awk '$5 == 0 '| awk '{print $2,$3,$4}' > output.txt

sort -k 2n < input.txt

2 1 1
3 1 4
3 1 7
2 2 5
2 2 8
1 3 2
2 3 8
5 3 4
5 3 6

sort -k 2n < input.txt| awk -F\ '{ print NR, $0, count[$2]++ }'
1 2 1 1 0
2 3 1 4 1
3 3 1 7 2
4 2 2 5 0
5 2 2 8 1
6 1 3 2 0
7 2 3 8 1
8 5 3 4 2
9 5 3 6 3

sort -k 2n < input.txt| awk -F\ '{ print NR, $0, count[$2]++ }' | awk '$5 == 0 '
1 2 1 1 0
4 2 2 5 0
6 1 3 2 0

sort -k 2n < input.txt| awk -F\ '{ print NR, $0, count[$2]++ }' | awk '$5 == 0 '| awk '{print $2,$3,$4}' >output.txt

more output
2 1 1
2 2 5
1 3 2


Memilih min max dari sebuah array:

more data.txt
 5     74904317     0.37733
 5     74904317     0.37086
 1     30166376     0.01567
 1     30166376     0.01209
 19     36070251     0.01055
 19     36070251     0.00406
 19     36070251     0.00041
 5     74866563     0.38506
 5     74866563     0.38083

Dalam hal ini saya akan mencari nilai min dan max dari kolom ke-2

awk '{print $2} ' data.txt | awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1<min) {min=$1}} END {print min, max}' 30166376 74904317 


Memprint satu kali untuk setiap perulangan yang berada pada kolom ke-1
awk 'a !~ $1; {a=$1}' data.txt
 5     74904317     0.37733
 1     30166376     0.01567
 19     36070251     0.01055
 5     74866563     0.38506


Mengubah format:
more data2.txt
1 5.2e+09
2 4.2e+09
3 2.2e+09
4 1.8e+09
5 1.1e+09
6 1.3e+09

awk '{printf "%.1d %.0f\n ",$1,$2} ' data2.txt
1 5200000000
2 4200000000
3 2200000000
4 1800000000
5 1100000000
6 1300000000


Format general ke e+
more data3.txt
1 5200000000
2 4200000000
3 2200000000
4 1800000000
5 1100000000

awk '{printf "%.1d %.1e\n ",$1,$2} ' data3.txt
1 5.2e+09
2 4.2e+09
3 2.2e+09
4 1.8e+09
5 1.1e+09

Selengkapnya:
 printf "%d", 99/2               49
 printf "%e", 99/2               4.950000e+01
 printf "%f", 99/2               49.500000
 printf "%6.2f", 99/2            49.50
 printf "%g", 99/2               49.5
 printf "%o", 99/2               61
 printf "%06o", 99/2             000061
 printf "%x", 99/2               31
 printf " |%s |", "January"         |January |
 printf " |%10s |", "January"       |   January |
 printf " |%-10s |", "January"      |January    |
 printf " |%.3s |", "January"       |Jan |
 printf " |%10.3s |", "January"     |       Jan |
 printf " |%-10.3s |", "January"    |Jan        |
 printf "%%"                     %


Tab untuk memisahkan kolom:
awk '{printf "%.1d %.1d %.5f\n ",$1,$2,$3} ' data.txt
5 74904317 0.37733
 5 74904317 0.37086
 1 30166376 0.01567
 1 30166376 0.01209
 19 36070251 0.01055
 19 36070251 0.00406
 19 36070251 0.00041
 5 74866563 0.38506
 5 74866563 0.38083

Setelah dipisahkan:
awk '{printf "%d\t %.1d\t %.5f\n ",$1,$2,$3} ' data.txt
5     74904317     0.37733
5     74904317     0.37086
1     30166376     0.01567
1     30166376     0.01209
19     36070251     0.01055
19     36070251     0.00406
19     36070251     0.00041
5     74866563     0.38506
5     74866563     0.38083
Contoh data.txt
12      34      12
212     11      98
454     82      111
121     233     111
434     345     11
434     32      12
565     22      888
56      8776    888

grep from kolom 1
awk -F"|" '$1 ~ /565/{print}' data.txt
565     22      888


Count number of occurance in column 3
numeric:
awk '{arr[$3]++} END {for(i in arr) print i,arr[i]}' data.txt | sort -n -k2
11 1
98 1
111 2
12 2
888 2

string:
awk '{count[$3]++}END{for(j in count) print j,"("count[j]" prizes)"}' FS=: data.txt

sort based on col 2 then 3
sort -k 2,2 -k3,3n data.txt
212     11      98
565     22      888
121     233     111
434     32      12
12      34      12
434     345     11
454     82      111
56      8776    888

sort based on col 1 then 2 then 3
sort -k1,1 -k2,2 -k3,3n data.txt
12      34      12
121     233     111
212     11      98
434     32      12
434     345     11
454     82      111
56      8776    888
565     22      888

col1 (Ascending) col2 (Descending) col3 (Ascending)
sort -n -k1,1 -k2,2r -k3,3 data.txt


cummulative sum in column 1
awk 'BEGIN {sum=0} {sum= sum+$0; print sum}' data.txt
in octave or matlab: cumsum

miscellaneous
Xlib: connection to "xxxxxxxxxxxxxxxxxxx" refused by server
Xlib: No protocol specified

xauth list
setenv DISPLAY xxxxxxxxxxxxxxxxxxxxxxx
xauth add xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxx


read segy data from tape

#!/bin/sh
folder="/path/folder_you_want_to_put_data"
\rm input_file.segy IL*_gathers.segy;
rsh machine_name mt -t /dev/IBMtape0n rewind
rsh machine_name "cd $folder; pwd; dd ibs=65000 if=/dev/IBMtape0n of=input_file.segy"
#rsh machine_name mt -t /dev/IBMtape0 eject


menggabungkan file, lalu mengambil kolom tertentu
pr -m -t -s\  file1 file2 | gawk '{print $4,$5,$6,$1}'

Mencari lokasi baris-ke dari sebuah file dengan katakunci:
sed -n '/katakunci/='  filein


Koneksi mesin lain
ssh -X LinuxID@Linuxmachine

No comments: