動作環境
CentOS 6.8
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec
NCEP FNLデータを取得するとき、Web上でリスト項目をクリックしてcshスクリプトが生成される。
そのcshを使ってファイルを取得する、ということができる。
クリックを数十回するのが面倒くさいし、間違いの元だ。
cshスクリプトを変更した方が時間節約でき、失敗も少なくなるだろう。
code v0.1 > リスト表示だけ
自動生成されるcshスクリプトが勉強材料。
以下の実装をした。
#!/bin/csh
set filelist = ( \
grib2/2016/2016.11/fnl_20161108_00_00.grib2 \
grib2/2016/2016.11/fnl_20161108_06_00.grib2 \
grib2/2016/2016.11/fnl_20161108_12_00.grib2 \
grib2/2016/2016.11/fnl_20161108_18_00.grib2 \
)
while($#filelist > 0)
echo "$filelist[1]"
shift filelist
end
exit 0
結果
$ csh csh_string_exec
grib2/2016/2016.11/fnl_20161108_00_00.grib2
grib2/2016/2016.11/fnl_20161108_06_00.grib2
grib2/2016/2016.11/fnl_20161108_12_00.grib2
grib2/2016/2016.11/fnl_20161108_18_00.grib2
code v0.2 > day, hourループを追加
#!/bin/csh
set answerlist = ( \
grib2/2016/2016.11/fnl_20161108_00_00.grib2 \
grib2/2016/2016.11/fnl_20161108_06_00.grib2 \
grib2/2016/2016.11/fnl_20161108_12_00.grib2 \
grib2/2016/2016.11/fnl_20161108_18_00.grib2 \
)
set hourlist = ( _00 _06 _12 _18 )
set daylist = ( 08 09 10 11 12 13 14 15 16 17 )
set prefix = "grib2/2016/2016.11/fnl_201611"
set postfix = "_00.grib2"
echo "Code:"
foreach aday ($daylist)
foreach ahour ($hourlist)
echo $prefix$aday$ahour$postfix
end
end
echo "Answer:"
while($#answerlist > 0)
echo "$answerlist[1]"
shift answerlist
end
exit 0
結果
$ csh csh_string_exec
Code:
grib2/2016/2016.11/fnl_20161108_00_00.grib2
grib2/2016/2016.11/fnl_20161108_06_00.grib2
grib2/2016/2016.11/fnl_20161108_12_00.grib2
grib2/2016/2016.11/fnl_20161108_18_00.grib2
grib2/2016/2016.11/fnl_20161109_00_00.grib2
grib2/2016/2016.11/fnl_20161109_06_00.grib2
grib2/2016/2016.11/fnl_20161109_12_00.grib2
grib2/2016/2016.11/fnl_20161109_18_00.grib2
grib2/2016/2016.11/fnl_20161110_00_00.grib2
grib2/2016/2016.11/fnl_20161110_06_00.grib2
grib2/2016/2016.11/fnl_20161110_12_00.grib2
grib2/2016/2016.11/fnl_20161110_18_00.grib2
grib2/2016/2016.11/fnl_20161111_00_00.grib2
grib2/2016/2016.11/fnl_20161111_06_00.grib2
grib2/2016/2016.11/fnl_20161111_12_00.grib2
grib2/2016/2016.11/fnl_20161111_18_00.grib2
grib2/2016/2016.11/fnl_20161112_00_00.grib2
grib2/2016/2016.11/fnl_20161112_06_00.grib2
grib2/2016/2016.11/fnl_20161112_12_00.grib2
grib2/2016/2016.11/fnl_20161112_18_00.grib2
grib2/2016/2016.11/fnl_20161113_00_00.grib2
grib2/2016/2016.11/fnl_20161113_06_00.grib2
grib2/2016/2016.11/fnl_20161113_12_00.grib2
grib2/2016/2016.11/fnl_20161113_18_00.grib2
grib2/2016/2016.11/fnl_20161114_00_00.grib2
grib2/2016/2016.11/fnl_20161114_06_00.grib2
grib2/2016/2016.11/fnl_20161114_12_00.grib2
grib2/2016/2016.11/fnl_20161114_18_00.grib2
grib2/2016/2016.11/fnl_20161115_00_00.grib2
grib2/2016/2016.11/fnl_20161115_06_00.grib2
grib2/2016/2016.11/fnl_20161115_12_00.grib2
grib2/2016/2016.11/fnl_20161115_18_00.grib2
grib2/2016/2016.11/fnl_20161116_00_00.grib2
grib2/2016/2016.11/fnl_20161116_06_00.grib2
grib2/2016/2016.11/fnl_20161116_12_00.grib2
grib2/2016/2016.11/fnl_20161116_18_00.grib2
grib2/2016/2016.11/fnl_20161117_00_00.grib2
grib2/2016/2016.11/fnl_20161117_06_00.grib2
grib2/2016/2016.11/fnl_20161117_12_00.grib2
grib2/2016/2016.11/fnl_20161117_18_00.grib2
Answer:
grib2/2016/2016.11/fnl_20161108_00_00.grib2
grib2/2016/2016.11/fnl_20161108_06_00.grib2
grib2/2016/2016.11/fnl_20161108_12_00.grib2
grib2/2016/2016.11/fnl_20161108_18_00.grib2
備考
set daylist = ( 08 09 10 11 12 13 14 15 16 17 )
をseqなどで生成してもいいが、0パディングする方法(8の値から"08"にする方法)を知らない。
daylist手打ちでも作業負荷は少ないので、ここまでとする。
code v0.3 downlistに格納
#!/bin/csh
set answerlist = ( \
grib2/2016/2016.11/fnl_20161108_00_00.grib2 \
grib2/2016/2016.11/fnl_20161108_06_00.grib2 \
grib2/2016/2016.11/fnl_20161108_12_00.grib2 \
grib2/2016/2016.11/fnl_20161108_18_00.grib2 \
)
set hourlist = ( _00 _06 _12 _18 )
set daylist = ( 08 09 10 11 12 13 14 15 16 17 )
set prefix = "grib2/2016/2016.11/fnl_201611"
set postfix = "_00.grib2"
set downlist = ()
foreach aday ($daylist)
foreach ahour ($hourlist)
set downlist = ( $downlist $prefix$aday$ahour$postfix)
end
end
echo "Code:"
while($#downlist > 0)
echo "$downlist[1]"
shift downlist
end
echo "Answer:"
while($#answerlist > 0)
echo "$answerlist[1]"
shift answerlist
end
exit 0
動作結果はv0.2と同じ。
downlistに格納されるので、その後の処理がそのまま使える。
このスクリプトを使って実作業時間5分が数秒になった。
スクリプト生成時間は15分なので、3回で元が取れる。