awk tips 整列されたテキストデータの処理
項目文例
必要な列を抜き出す 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
とします。

back