GRIB-1 ファイルの dump (wgrib コマンド)
GIRB-1 形式ファイル(単に GRIB ファイルと称されることある)の 読み出し(デコード; decode)に関するメモ.
- GRIB & wgrib 情報 に戻る
- 気候学気象学関連情報 に戻る
- GRIB2 ファイルのdump (wgrib2 コマンド) を見る
wgrib の使用方法・実行例
読み出したいGRIBファイル名を hoge.grib とする.
コマンドラインでの使い方はこんな感じ:
wgrib [オプション] hoge.grib
これだけじゃ単純過ぎると思うかもしれませんが, wgrib のオプションと UN*X コマンドを使い, シェルスクリプト内で時間に関するループなどを使えば, データの抜き出し・バイナリ変換など,データ解析時に必要な事な一次処理の大部分が実現できます.
wgrib サンプルスクリプト
1変数だけを抜き出して時系列データにする
- JRA25/JCDAS のモデル面データ (6-hourly) から,東西風成分のみを抜き出し,GRIBファイルとして保存するスクリプト.
- 例では,10-m u-wind を除いて,モデル面だけを選択 (grep ":kpds6=109" の部分).
- 変数の名前 (UGRD) を grep 抜き出ししているが,変数コード (東西風なら,kpds5=33) を使うのもよい.
- スクリプト全文は,本ページ末尾(cat_one_var.sh スクリプト全文)を参照. スクリプトのダウンロードはこちら (filename: cat_one_var.sh)
- 実行時に "Undefined parameter table (center 34-0 table 3), using NCEP-opn" というメッセージが出るが,実行結果に問題無し(たぶん).どうしても気になる人は,wgrib コマンド使用時のメッセージ(GRIBテーブル未対応)の記述を参照.
1変数だけを抜き出して時系列データにする
私的に作った wgrib の使い方
以下は極めて古い(最終更新:2001年9月)バージョンだが, 大部分が現在でも通用するはず.
*** wgrib の使い方 (日本語版) *** Oct. 24, 1997 last updated : Sep. 18, 2001 written by : M. HAYASAKI 文中の言葉の意味 ifile : input file ofile : output file を意味する ※ GrADS ユーザは 3)を見ると良いでしょう 0) wgrib wgrib のオプションが表示される。 1) wgrib ifile ifile のデータリストが表示される。 ※簡潔な情報で良いなら、wgrib -s ifile とすればよい (こちらの方が画面サイズ(例えば80文字で設定してたら)の都合上、 行の折り返しが無くて読みやすい) 2) wgrib ifile | grep ":HGT:" | wgrib ifile -i -grib -o ofile ifile からジオポテンシャル高度だけ切り出して、GRIB 形式で ofile に出力する。 3) wgrib ifile | grep ":HGT:" | wgrib ifile -i -bin -nh -o ofile ifile からジオポテンシャル高度だけ切り出して、ヘッダ無しの BINARY 形式 で ofile に出力する。 ※ 主に GrADS でアクセスする形式。 実行する計算機のCPUに依存した endian code で出力される 3.1) wgrib ifile | grep ":HGT:" | wgrib ifile -i -ieee -nh -o ofile ifile からジオポテンシャル高度だけ切り出して、ヘッダ無しの IEEE 形式 で ofile に出力する。 ※ 主に GrADS でアクセスする形式。 IEEE に準拠したフォーマット endian code で出力される。 (IEEE の詳細は知らないが) little endian 系のPCであっても big endian で出力されるため、例えば PC UNIX(Linux, FreeBSD など) で使用したデータをSunなどの(big endian系) Work Stationに移動しても バイナリデータの読み出しが可能 4) wgrib ifile | grep ":HGT:" | wgrib ifile -i -bin -o ofile ifile からジオポテンシャル高度だけ切り出して、ヘッダつきの BINARY 形式 で ofile に出力する。 ※ Fortran で sequential にアクセスする形式 ** 例 ** real*4 data(144,73) read(21) data ↑これで読める形式のファイルになります 5) wgrib ifile -d 137 -grib -o ofile ifile の137番目のデータを GRIB 形式で ofile に出力 6) wgrib ifile | grep ":HGT:" | grep ":500 mb:" | wgrib ifile -i -grib -o ofile ifile から 500hPa のジオポテンシャル高度だけ切り出して、 GRIB 形式で ofile に出力 7) wgrib ifile -d 116 -grib -append -o ofile ifile から116番目のデータを取り出し、GRIB 形式で(すでに存在している) ofile に追加 ※例えば 6) と併用するなどして自分が良く使用するデータだけを 抜きだして別ファイルに格納する場合などで使える 8) wgrib ifile -V ifile のファイル情報を表示 ※ process ID の確認などで使用。 NCEP-NCAR Reanalysis では、様々な問題から幾度かの rerun を 行っている。自分が使用しているデータがどの時点のものか (rerun 以前か以後か)を確認する際に、process ID を参照する ---------------------------------------------------------------------- ** おまけ ** ※当時(1997年10月)のニュース *-- そういえばこんなことあったよなぁ --* 10/22 安室奈美恵(20歳)電撃結婚!! 相手は TRF の SAM(35歳;丸山正温) 10/23 ヤクルト、西武を破り日本一(4勝1敗) World Cup ネタ : 果して、日本はフランスへ行けるのか? 明日(10/26)、崖っ淵の UAE 戦
最後の一言は,最初に記述した日の直前にあった出来事のメモ。 当時は記憶が鮮明だったので勢いで書いてしまったが, まさか10年以上もこのメモを残すことになるとは思いもよらなかった. いつでも消去できるのだが,つい残してしまっている.
tricks.wgrib の簡易日本語訳
以下は極めて古い(最終更新:1998年11月)バージョンだが, 大部分が現在でも通用するはず.
5/97 Tricks for wgrib (日本語版) ------ --- ----- 翻訳者:早崎将光 last updated : 10 Nov, 1998 ※注意 文中の \ マークは行が継続していることを意味しています。 実際には打ち込む必要はありません。 Every once in a while, someone requests that I add some feature to wgrib. Usually I say no because I'm lazy. I then give the excuse that feature is already available with a bit of UNIX trickery. ようするに wgrib コワザ集ということですな。 (1) How do I convert the entire file to binary? バイナリにおとすには? wgrib grib_file | wgrib -i grib_file -o binary_file (2) How do I get a verbose listing of the 20th record only? 20番目のデータだけの情報を見るには? wgrib -V -d 20 grib_file (2') How about a verbose listing without a dump file? 情報だけ見て dump ファイルを作らない(すなわち出力をしない) wgrib -V -d 20 grib_file -o /dev/null (3) How do I extract the 20th and 30th records? 20番目と30番目のデータを出力するには? wgrib grib_file | egrep "(^20:|^30:)" | wgrib -i grib_file -o binary_file (4) How do I extract the first 10 records as a grib file? 最初の10個分のデータを出力するには?(GRIB format で出力) wgrib grib_file | head -n 10 | wgrib -i grib_file -grib -o new_grib_file (note: on older systems you may have to use "head -10") (5) How do I extract the 500 Heights from a file (grib->grib)? 500hPa 高度だけを出力するには?(GRIB format で出力) wgrib -s grib_file | grep ":HGT:500 mb:" | wgrib -i -grib \ grib_file -o new_grib_file (6) How do I eliminate the 500 Heights from a file (grib->grib)? 500hPa 高度だけを取り除くには?(GRIB format で出力) wgrib -s grib_file | grep -v ":HGT:500 mb:" | wgrib -i -grib \ grib_file -o new_grib_file (6.1) 閏年の2/29だけを取り除くには?(1988年を例にする) wgrib -s grib_file | grep -v ":d=880229" | wgrib -i -grib \ grib_file -o new_grib_file (7) How do I extract the winds and temperatures from a file (grib->grib)? 風(u,v)・気温(T)を取り出すには?(GRIB format で出力) wgrib -s grib_file | egrep "(:UGRD:|:VGRD:|:TMP:)" | wgrib -i -grib \ grib_file -o new_grib_file (8) How many records does this file have? 幾つ(行数)データがあるか調べる時には? wgrib -s grib_file | wc -l (9) What is the range of values in this file? データの範囲(最大・最小値などの情報)は? wgrib -V grib_file | grep max (9') What is the maximum of the 500 mb Heights for each record. 最大値は? wgrib grib_file -s | grep ":HGT:500 mb:" | wgrib -V grib_file -o /dev/null \ | grep max | awk '{print $4}' For the minimum values, change "print $4" to "print $3". ※最小値は $4 を $3 に変更すりゃええよ (10) How do I do a file transpose (rearrange the order) ? See ts2synoptic. This script could be pared down to 3 lines! Other file transposes are done in a similar manner and many only need one line! Unfortunately finding that one line may require some effort. (11) My grib file has junk at the start/end. How do I get rid of it? wgrib old_gribfile | wgrib old_gribfile -i -grib -o clean_gribfile (12) Don't forget that you can 'cat' grib files. That gives you another tool for making your own tricks. GRIB 形式のファイルは、cat コマンドでつなげりゃ、それで連続データ になるよ。 だから、他のコマンドを組み合わせりゃ、もっとトリッキーなことも 出来るぜ! (13) My grib file has same data on different grids. How do I filter out all the grids but one? Normally filtering data is very easy with wgrib; however, the grid parameter is only included in the -V output which is not suitable for filters. The following script takes the "grids" field from the -V output and adds it the "index" file. ---------------------- example.sh ------------------------------- : # # add " grid=n " to the index file # # usage: example.sh grib_file tmpfile1=/tmp/junk1.$$$ tmpfile2=/tmp/junk2.$$$ # extract "grid=n" wgrib $1 -V | grep " grid=" | sed -e 's/^.*grid=/grid=/' -e 's/ .*$//' >$tmpfile1 wgrib $1 -s >$tmpfile2 paste -d: $tmpfile2 $tmpfile1 rm $tmpfile1 $tmpfile2 exit 0 ----------------------------------------------------------------- The above script could serve as a prototype for other "custom" "index" files. (14) I execute the following commands to extract TMP, and HGT to separate files. Can I make if faster. TMP(気温)とHGT(ジオポテンシャル高度)を取り出して 別ファイルに格納したいけど、実行速度を早めることは出来るかね? wgrib pgb.grb | grep ":TMP:" | wgrib -i pgb.grb -grib -o tmp.grb wgrib pgb.grb | grep ":HGT:" | wgrib -i pgb.grb -grib -o hgt.grb Try: wgrib pgb.grb > inventory cat inventory | grep ":TMP:" | wgrib -i pgb.grb -grib -o tmp.grb cat inventory | grep ":HGT:" | wgrib -i pgb.grb -grib -o hgt.grb rm inventory つまり、最初にデータリスト(ファイル名:invent)を作っておいて、 それを参照して wgrib コマンドを使う、ということ。 Of course, the second line from the previous example could be replaced by grep ":TMP:" inventory | wgrib -i pgb.grb -grib -o tmp.grb d line from the previous example could be replaced by grep ":TMP:" inventory | wgrib -i pgb.grb -grib -o tmp.grb ---------------------------------------------------------------------- ※ 以下、オリジナルには無い翻訳者の私的なメモ (a) 00Z,12Z だけ取り出したい時には? wgrib -s ifile | gawk -F':' '$3 ~ /00$/ || $3 ~ /12$/ {print $0}' >! invent cat invent | wgrib -i ifile -grib -o ofile > /dev/null これを実行すると GRIB ファイルのリストは画面表示されず、ヌルデバイス (/dev/null ; よーするに何もしない) に送られる。 (b) 主要6要素のみの出力 wgrib -s prs.grib.mean.clim.y79-95 | egrep "(:HGT:|:UGRD:|:VGRD:|:TMP:|:VVEL:|:RH:)" | wgrib -i prs.grib.mean.clim.y79-95 -grib -o outfile > /dev/null
GRIB データへの GrADS による直接アクセス
基本
GrADS ユーザにとっては,最も楽にGRIBファイルにアクセスする方法(の一つ). grib2ctl.pl と GrADS 付属の gribmap コマンドを使用.
- NCEP/NCAR Reanalysis data の場合
grib2ctl -ncep_rean -no_prs hogehoge.grib > hogehoge.ctl gribmap -i hogehoge.ctl -0 ※gribmap の最後のオプションは「ゼロ」です.
大学などの研究室での共用計算機の場合, grib2ctl.pl は /usr/loca/bin/ 以下など PATH の通ったところに置いて, 全ユーザが実行可能に設定すべき. 私の場合, ".pl" をタイプすることすら面倒なので, /usr/loca/bin/ 以下に grib2ctl という 名前のシンボリックリンクを張って使っている.
補足1. -no_prs の意味
気圧面データの場合、default で変数名に"prs"がついてしまう (気温の場合なら、 ctl file の変数名は "TMPprs" になってしまう). "-no_prs" は,これを付けないようにするためのオプション.
補足2. option template の利用
例えば1年毎に 1 file になっているGRIBデータをGrADSの "options template" を使ってアクセスしたい場合, 以下の順序で idx ファイルを作成します.
例: 月平均ジオポテンシャル高度, 年別に1ファイル(ファイル名: HGT_${yyyy}.grb; yyyy = 1979 - 2008), 30年分(1979-2008)の場合
- まず,対象とする最初のGRIBファイルに対し grib2ctl 実行,ctl file を作る
- 作成した ctl file で,"dset" & "options" & "tdef" 部分を修正
(修正前) dset ^HGT_1979.grb (修正後) dset ^HGT_%y4.grb
(追記 or 修正) options template
(修正前) tdef 12 linear 00Z01jan1979 1mo (修正後) tdef 360 linear 00Z01jan1979 1mo ※ monthly mean, 30年分のデータの数(12*30=360)
- 最後に gribmap を実行すれば O.K.! idx ファイルが作成されているはず
注意点
NCEP再解析データ以外であっても,-ncep_rean オプション使って大抵は問題ない. いわゆる主要気象要素(Z, T, u, v, omega, など)なら, 変数番号(GRIBのPDS5だっけ?)も同じであることが多いため. 注意が必要なのは,対象とした客観解析データ独自の変数を出力している場合. その時には,wgrib コマンドが参照する変数テーブルと NCEP再解析のそれと一致しないため, GrADS ctl ファイルが本来とは異なる変数名で書かれてしまうかもしれない.
そうならないための対策は,GRIB テーブル部分を入れ替えること. JRA25 用のGRIBテーブル作成・使用方法を参照. なお,wgrib.c のソースコードを見れば, wgrib コマンド内部にも比較的容易に組み込めそうなことが分かる. やってみては如何? >> Cに詳しい人
wgrib & GRIB 関連リンク
- wgrib 本家サイト
- grib2ctl 本家サイト: このページの後半部分の "Files" にて,ソースコードや anonymous FTP サイトの情報がある
wgrib の使用例(全文)
1変数だけを抜き出して時系列データにする
#!/bin/sh # # !! Monthly catalogue from 6-hrly files # # last update: 2012-06-18 # 1st release: 2008-07-24 # # 1-month 全部を単純に cat でつなげたら,2 GB を超過した. # 現在使用中の wgrib では,ファイルサイズ2GB超過すると,アクセスできない. # 必要要素だけを切り出すことにする (2008-07-24) # variables on p-level: HGT, TMP, UGRD, VGRD (26-lev); RH, VVEL (21-lev) # variables on ground or 2-D: SLP, HGTsfc, TMPsfc, TMP2m, RH2m, UGRD10m, VGRD10m # invariant: HGTsfc, LANDsfc (land=1, sea=0; fraction) ########## start of subroutine function chk_dir { DIR=$1 if [ ! -d ${DIR} ]; then mkdir -p ${DIR} fi } ########## end of subroutine tmp01=hogehoge1.tmp tmp02=hogehoge2.tmp tmp03=hogehoge3.tmp tmp_list=" $tmp01 $tmp02 $tmp03 " # var_list=" UGRD VGRD TMP HGT VVEL SPFH " var_list=" UGRD " : ${prefix:="anl_mdl"} s_yyyymmdd=20110301 e_yyyymmdd=20110302 hh_list=" 00 06 12 18 " ### Set I/O directories ipath=$HOME/tmp/${prefix} opath=$HOME/tmp/${prefix}_${var} #ipath=$PWD #opath=$PWD ############## chk_dir $opath for var in $var_list ; do ofile=${opath}/${var}_${prefix}_${s_yyyymmdd}-${e_yyyymmdd}.grb if [ -f $ofile ]; then \rm -f ${ofile} ; touch ${ofile} ; fi if [ -f $tmp01 ]; then \rm -f ${tmp01} ; touch ${tmp01} ; fi yyyymmdd=$s_yyyymmdd while [ $yyyymmdd -le $e_yyyymmdd ] ; do yyyy=${yyyymmdd:0:4} mm=${yyyymmdd:4:2} dd=${yyyymmdd:6:2} for hh in $hh_list ; do ifile=${ipath}/${prefix}.${yyyymmdd}${hh} ### Model-level data (HGT, TMP, UGRD, VGRD, SPFH, VVEL, ...) echo -e "\t Date = $yyyy $mm $dd $hh " ### All u-wind (model level and 10-m above ground) # wgrib -4yr ${ifile} | grep ":${var}:" >> $tmp01 ### u-wind at model level (40-level in JRA25/JCDAS) wgrib -4yr ${ifile} | grep ":${var}:" | grep ":kpds6=109:" >> $tmp01 cat $tmp01 | wgrib -4yr -i -append -grib ${ifile} -o $ofile > /dev/null done # "hh" yyyymmdd=`\date --date="${yyyymmdd} +1 day" +%Y%m%d` done # "yyyymmdd" done # "var" ### Clean-up temporary files for i in $tmp_list ; do if [ -f $i ]; then \rm -f $i ; fi done # i exit
JRA55 月平均気候値のGRIB1ファイルの ctl & idx 作成
JRA55 で配布されている気候値(1981-2010年の平均値)には,GrADS用の ctl & idx が存在しない. 不便なので,自作するスクリプトを作った. grib2ctl.pl と gribmap (GrADSに同梱)が必須. JRA55 のGRIBテーブルもあれば,余計なエラーメッセージを抑制できる.
#!/bin/bash # Make GrADS ctl and index files for the JRA55 monthly climatologies. # # 1st release: 2014-04-17 # M. Hayasaki (Univ. Tsukuba) local_base_path=~/reanal01/reanal/JRA55/grib/Clim8110 tmp00=/dev/shm/tmp00_$$.txt tmp01=/dev/shm/tmp01_$$.txt ### GRIB table file (JRA-55.gribtab) for JRA55 is obtained from ### ftp://ds.data.jma.go.jp/data19/JRA-55/Const/ ### (Registered user only) export GRIBTAB=$HOME/JRA/util/JRA-55.gribtab var_list=" anl_p125 " var_list=" anl_column125 anl_isentrop125 anl_land125 anl_p125 anl_snow125 anl_surf125 \ fcst_column125 fcst_land125 fcst_p125 fcst_phy2m125 fcst_phyland125 fcst_surf125 ice125 " temporal_list=" Daily Monthly " # daily climatology have NOT tested yet. temporal_list=" Monthly " ### Main loop for temporal in $temporal_list ; do for var in $var_list ; do ### data size (1-var, 1-lev, 1-time) = 46718 byte (constant) # daily total (1-var, 1-lev, 4-times for 6-hrly) = 186872 byte (182 byte) case $var in anl_p125) elm_list=" strm vpot rh relv " elm_list=" hgt tmp ugrd vgrd vvel spfh depr reld relv rh strm vpot " # 8-variable (major variables. DONOT download depr, reld, relv, rh) # elm_list=" hgt tmp ugrd vgrd vvel spfh strm vpot " # DEBUG, TEST # elm_list=" hgt " ;; anl_isentrop125) elm_list=" bvf2 hgt mntsf spfh vvel pvor pres ugrd vgrd " # elm_list=" pvor " # TEST ;; fcst_p125) elm_list=" ciwc clwc cwat ozone tcdc " ;; *) elm_list=" dummy " ;; esac for elm in $elm_list ; do local_base=${local_base_path}/${temporal}/${var} if [ ! -d ${local_base} ] ; then mkdir -p ${local_base} fi case $elm in dummy) prefix="${var}" ;; *) prefix="${var}_${elm}" # anl_p125_hgt.YYYYMMDDhh ;; esac cd ${local_base} local_path="." # Current directory (for ncftpget command) target_ctl=${prefix}.clim8110.ctl target_idx=`basename $target_ctl .ctl`.idx monthly_dset_basename=${prefix}.clim8110.mon ### 1st timestep (Jan; ex. "anl_p125_hgt.clim8110.mon01") target_file=${monthly_dset_basename}01 grib2ctl -no_prs ${target_file} > $tmp00 ## replace "dset" sed -e "s/dset \^${target_file}/dset \^${monthly_dset_basename}%m2/g" $tmp00 > $tmp01 \mv -f $tmp01 $tmp00 ## replace "index" sed -e "s/index \^${target_file}.idx/index \^${target_idx}/g" $tmp00 > $tmp01 \mv -f $tmp01 $tmp00 ## replace "options" sed -e "s/options yrev/options yrev template/g" $tmp00 > $tmp01 \mv -f $tmp01 $tmp00 ## replace "title" sed -e "s/title ${target_file}/title ${temporal} climatology (8110) of ${prefix}/g" $tmp00 > $tmp01 \mv -f $tmp01 $tmp00 ## replace "tdef" sed -e "s/tdef 1 linear 00Z01jan1981 1mo/tdef 12 linear 00Z01jan1981 1mo/g" $tmp00 > $tmp01 \mv -f $tmp01 $tmp00 ## Move to final output GrADS ctl, and then make index file. \mv -f $tmp00 ${target_ctl} gribmap -i ${target_ctl} -0 # echo "Get: ${prefix}.ctl" done # elm done # var done # temporal