LoginSignup
0
1

More than 5 years have passed since last update.

csh > リスト項目day,hourを用いたリストの生成 > while / shift使用 / foreach使用 / set downlist = ( $downlist $prefix$aday$ahour$postfix)

Last updated at Posted at 2016-12-06
動作環境
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回で元が取れる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1