シェルスクリプト: diff.vpt.sh
入力ファイル$in1 (MSM.ts.vpt.1000m.txt) と$in2 (MSM.ts.vpt.0100m.txt)の3列目同士のデータの差をとって、$out (MSM.ts.d_vpt.txt)に書き出します。
#!/bin/sh
in1=MSM.ts.vpt.1000m.txt
in2=MSM.ts.vpt.0100m.txt
out=MSM.ts.d_vpt.txt
i=0
while read BUF ; do
ary=(`echo $BUF`) # 配列に格納
if [ ${ary[0]} != "#" ]; then
datetime[$i]=${ary[0]}
vpt_up[$i]=${ary[2]}
i=$(expr $i + 1)
fi
done < $in1
echo
echo
i=0
while read BUF ; do
ary=(`echo $BUF`) # 配列に格納
if [ ${ary[0]} != "#" ]; then
datetime[$i]=${ary[0]}
vpt_low[$i]=${ary[2]}
i=$(expr $i + 1)
fi
done < $in2
n=$i
echo "# $(pwd)" > $out
echo "# $(hostname)" >> $out
echo "# $(whoami)" >> $out
echo "# $(date)" >> $out
echo "# $in1" >> $out
echo "# $in2" >> $out
echo "# datetime vpt_up vpt_low dvpt" >> $out
i=0
while [ $i -le $n ]; do
dvpt[$i]=$(echo "scale=2; ${vpt_up[$i]} - ${vpt_low[$i]}" |bc)
echo "${datetime[$i]} ${vpt_up[$i]} ${vpt_low[$i]} ${dvpt[$i]}" >> $out
i=$(expr $i + 1)
done
echo
echo $in1
echo $in2
echo $out
echo
exit 0
1つめの入力ファイル:MSM.ts.vpt.1000m.txt
# /work2/kunoki/to_manda_sensei/Tools/MSM.profiles.at.Stations
# aofd165.fish.nagasaki-u.ac.jp
# kunoki
# 2014年 10月 31日 金曜日 14:00:03 JST
# z= 1000 m
# datetime pt vpt
2012-06-15T02:00:00 298.983 301.205
2012-06-15T03:00:00 299.446 301.664
2012-06-15T04:00:00 299.983 302.296
2012-06-15T05:00:00 299.946 302.374
2012-06-15T06:00:00 300.780 303.302
2012-06-15T07:00:00 300.595 303.246
2012-06-15T08:00:00 301.577 304.379
2012-06-15T09:00:00 301.780 304.634
2012-06-15T10:00:00 301.861 304.791
2012-06-15T11:00:00 302.129 305.034
2012-06-15T12:00:00 302.442 305.314
2012-06-15T13:00:00 302.385 305.247
2012-06-15T14:00:00 302.331 305.138
2012-06-15T15:00:00 302.145 304.880
2012-06-15T16:00:00 302.756 305.357
2012-06-15T17:00:00 302.999 305.558
2012-06-15T18:00:00 303.099 305.585
2012-06-15T20:00:00 303.194 305.733
2012-06-15T22:00:00 303.149 305.731
2つ目の入力ファイル: MSM.ts.vpt.0100m.txt
# /work2/kunoki/to_manda_sensei/Tools/MSM.profiles.at.Stations
# aofd165.fish.nagasaki-u.ac.jp
# kunoki
# 2014年 10月 31日 金曜日 13:20:54 JST
# z= 100 m
# datetime pt vpt
2012-06-15T02:00:00 294.670 297.116
2012-06-15T03:00:00 294.928 297.470
2012-06-15T04:00:00 295.425 297.951
2012-06-15T05:00:00 295.633 298.197
2012-06-15T06:00:00 295.886 298.474
2012-06-15T07:00:00 296.173 298.955
2012-06-15T08:00:00 296.628 299.629
2012-06-15T09:00:00 297.125 300.395
2012-06-15T10:00:00 297.408 300.732
2012-06-15T11:00:00 298.020 301.446
2012-06-15T12:00:00 298.301 301.780
2012-06-15T13:00:00 298.628 302.145
2012-06-15T14:00:00 298.917 302.467
2012-06-15T15:00:00 298.951 302.509
2012-06-15T16:00:00 299.106 302.614
2012-06-15T17:00:00 299.114 302.597
2012-06-15T18:00:00 299.071 302.524
2012-06-15T20:00:00 299.072 302.451
2012-06-15T22:00:00 298.906 302.377
実行例:
$ diff.vpt.sh
(standard_in) 2: parse error
MSM.ts.vpt.1000m.txt
MSM.ts.vpt.0100m.txt
MSM.ts.d_vpt.txt
parse error の原因については調査中。
エラーの原因
$(echo "scale=2; ${vpt_up[$i]}-${vpt_low[$i]}" |bc)
回避策
${vpt_up[$i]}-${vpt_low[$i]}のマイナス記号(-)の前後に空白文字を入れる
$(echo "scale=2; ${vpt_up[$i]} - ${vpt_low[$i]}" |bc)
計算結果のファイル:MSM.ts.d_vpt.txt
# /work2/kunoki/to_manda_sensei/Tools/MSM.profiles.at.Stations
# aofd165.fish.nagasaki-u.ac.jp
# kunoki
# 2014年 10月 31日 金曜日 14:28:20 JST
# MSM.ts.vpt.1000m.txt
# MSM.ts.vpt.0100m.txt
# datetime vpt_up vpt_low dvpt
2012-06-15T02:00:00 301.205 297.116 4.089
2012-06-15T03:00:00 301.664 297.470 4.194
2012-06-15T04:00:00 302.296 297.951 4.345
2012-06-15T05:00:00 302.374 298.197 4.177
2012-06-15T06:00:00 303.302 298.474 4.828
2012-06-15T07:00:00 303.246 298.955 4.291
2012-06-15T08:00:00 304.379 299.629 4.750
2012-06-15T09:00:00 304.634 300.395 4.239
2012-06-15T10:00:00 304.791 300.732 4.059
2012-06-15T11:00:00 305.034 301.446 3.588
2012-06-15T12:00:00 305.314 301.780 3.534
2012-06-15T13:00:00 305.247 302.145 3.102
2012-06-15T14:00:00 305.138 302.467 2.671
2012-06-15T15:00:00 304.880 302.509 2.371
2012-06-15T16:00:00 305.357 302.614 2.743
2012-06-15T17:00:00 305.558 302.597 2.961
2012-06-15T18:00:00 305.585 302.524 3.061
2012-06-15T20:00:00 305.733 302.451 3.282
2012-06-15T22:00:00 305.731 302.377 3.354