#!/bin/sh# sacバイナリ形式データを，GMTのpsxy形式などで扱えるフォーマットの# アスキー形式に変換する（便利！）# # 筧注：このBourne Shellバージョンは九州大理学部の田代さんによるもの# ですが、田代さんはsac使いではないので動作確認はされていないそうです。# 筧がすべきなのですがサボって動作確認せずに載せてます。どなたか動作# 確認しませんか（笑）？もちろん大丈夫だとは思いますが。# # 一行目に，起動するシェルのインタプリタを指定．# この場合は，Bourne Shellを起動している．# よって，このスクリプトは Bourne Shellの文法である．sac <<EOF > /dev/null 2>&1r $1w alpha tmp$$EOF## <<EOF ### ヒアドキュメントと呼ばれるもので，# EOFという文字列のみの行が出て来るまでのデータを，# sacコマンドの標準入力から入力している．# ヒアドキュメントでは，シェル変数の展開も使えるのがポイントである．## > /dev/null 2>&1 ### sacコマンドからの標準出力と標準エラー出力は，どちらも捨てられる．# /dev/nullファイルは特殊なデバイスファイルで，# 出力リダイレクトに使えば，データを全てブラックホールのごとく# 飲み込んでしまい，一切を無きものにしてしまう．# コマンドの出力が邪魔だったりする場合に使おう．## r $1 ### シェルの位置パラメータ．シェルスクリプト実行時に指定する引数が代入される．# 例えば，このスクリプトの名前が"sactoasc.sh"だとすると，# 以下のように実行した場合，## sactoasc.sh data1.sac## $1にはdata1.sacが代入されることになる．## よって，スクリプトの引数にsacバイナリ形式のファイルを指定することによって，# sacのrコマンドでファイルのデータを読み込んでいる．## w alpha tmp$$ ### $$は，シェルの特殊変数の一つである．# これは，現在のプロセス番号(PID)を表示する．# PIDは各プロセスで必ず異なるので，# シェルスクリプトで一時的なファイル名に使うことは常套手段である．# 特に，他人も書き込めるような一時作業のディレクトリなどで実行する場合，# 他人の一時ファイルと同じになることがないので安全である．## よって，sacのwコマンドで一時ファイルtmp$$にデータを出力している．# alphaは「アスキーファイル」で出力する、の意．DELTA=`head -1 tmp$$ | awk '{print $1}'`## head -1 tmp$$ ### 一時ファイルtmp$$の，最初の一行目のみを出力する．## awk '{print $1}' ### 一番左のデータのみ（第一フィールド）を出力する．# バッククォートによるコマンド置換によって，# head -1 tmp$$ | awk '{print $1}'の実行結果の出力が，# シェル変数DELTAに代入される．tail +31 tmp$$ | awk '{printf "%f %s\n%f %s\n%f %s\n%f %s\n%f %s\n",5*(NR-1)*X,$1,(5*(NR-1)+1)*X,$2,(5*(NR-1)+2)*X,$3,(5*(NR-1)+3)*X,$4,(5*(NR-1)+4)*X,$5}' X=$DELTA## tail +31 tmp$$ ### 一時ファイルtmp$$の，31行目以降のみを出力する．## awk '{printf .... }' X=$DELTA ### NRは，awkの予約変数で，データの行数を表す．# Xはユーザー定義の変数で，X=$DELTAによってシェル変数DELTAの値が代入される．# これによって，sacバイナリデータが，# psxy等で扱えるアスキーデータになって標準出力される．rm -f tmp$$# 一時ファイルの削除