項目 | 文例 |
必要な列を抜き出す |
awk '{print $2,$4}' odata >tmp
awk '{if($3==1) print $2,$4}' awk '{if($3>1 && $4>1) print $2,$4}' # AND awk '{if($3>1 || $4>1) print $2,$4}' # OR awk '{if($3 % 2 ==0) print $2,$4}' # 余剰のあまり awk '{print NR,$1,$2}' #行番号 |
1行でawkの中にelse | awk '{if($1==1) print $1; else print $2}' |
関数グラフの作成 | awk 'BEGIN{for(x=-10;x<=10;x+=0.1)print x, x*x}' |
型変換 | awk '{if($5>-1) print int($7)}' tmp0 > tmp1 #整数にする |
数値の処理1:平均値 | cat snfal.dat | awk '{a+=$2} END{print a/NR;}' #行の平均値を計算 |
数値の処理2:2行以上のデータを読んで勾配を計算 |
やりたいことは、 21 100.0 20 95.0 のようなデータを読んで、(100.0-95.0)/(21-20)のような計算を逐一することです。 #!/bin/sh i=1 while [ $i -lt 101 ] do head -n $i tmp.dat | tail -n 2 | awk '{a+=$1}{b=$2}{c+=$2}{d=$1} END{print a/NR,(2*b-c)/(2*d-a);}' i=`expr $i + 1` done でできます(もっとシンプルにできそうですが・・・・・・) |
数値の処理3:複数行の平均を計算(running mean)など |
やりたいことは、 21 100 20 95 19 92 18 88 17 85 のようなデータを読んで、5行などの移動平均をとることです。。 #!/bin/sh input=input.txt running=15 i=$running rm -f out.txt wc=$( cat $input | wc -l ) while [ $i -lt $wc ] do head -n $i $input | tail -n $running > tmp.txt awk '{a+=$1}{b+=$2} END{print a/NR,b/NR;}' tmp.txt >> out.txt i=`expr $i + 1` done でできます. |
awkスクリプトを用いた文字列処理 |
ちょっと応用的な使い方
処理が多いとawkスクリプトを使います。 整列されているデータで、要素番号でなく、文字数で切るとき。たとえばこんなデータ要素番号で切ると、地名の間にスペースがある場合にずれてしまいます。整列されているデータであることを利用して文字数で切ります。長くなるのでスクリプトを使います。 { printf("%s\t", substr($0, 1,8)) #LAT printf("%s\t", substr($0, 8+1, 8)) #LON printf("%s\t", substr($0, 56, 6)) # printf("%s\t", substr($0, 65, 6)) # printf("%s\n", substr($0, 74, 6)) # print "" #強制的に改行 } をtest.awkというファイルに保存しておいて、 awk -f test.awk data とします。 |