早崎トップ 研究(気候気象) 研究(大気汚染) データリスト Linux Tips Mac Tips

wgrib 使用方法

GRIB-1 ファイルの dump (wgrib コマンド)

GIRB-1 形式ファイル(単に GRIB ファイルと称されることある)の 読み出し(デコード; decode)に関するメモ.

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 の使用例(全文)

 1変数だけを抜き出して時系列データにする

cat_one_var.sh

#!/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テーブルもあれば,余計なエラーメッセージを抑制できる.

mk_ctl_JRA55_clim.sh

#!/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