#!/bin/csh -f# sacバイナリ形式データを，GMTのpsxy形式などで扱えるフォーマットの# アスキー形式に変換する（便利！）## 一行目に，起動するシェルのインタプリタを指定．# この場合は，C Shellを起動している．# よって，このスクリプトは C Shellの文法である．# -fオプションは，.cshrcなどの設定ファイルを読み込まずに起動する意味．sac <<EOF >& /dev/nullr $argv[1]w alpha tmp$$EOF## <<EOF ### ヒアドキュメントと呼ばれるもので，# EOFという文字列のみの行が出て来るまでのデータを，# sacコマンドの標準入力から入力している．# ヒアドキュメントでは，シェル変数の展開も使えるのがポイントである．## >& /dev/null ### sacコマンドからの標準出力と標準エラー出力は，どちらも捨てられる．# /dev/nullファイルは特殊なデバイスファイルで，# 出力リダイレクトに使えば，データを全てブラックホールのごとく# 飲み込んでしまい，一切を無きものにしてしまう．# コマンドの出力が邪魔だったりする場合に使おう．## $argv[1] ### シェルの位置パラメータ．シェルスクリプト実行時に指定する引数が代入される．# 例えば，このスクリプトの名前が"sactoasc.csh"だとすると，# 以下のように実行した場合，## sactoasc.csh data1.sac## $argv[1]にはdata1.sacが代入されることになる．## よって，スクリプトの引数にsacバイナリ形式のファイルを指定することによって，# sacのrコマンドでファイルのデータを読み込んでいる．## tmp$$ ### $$は，シェルの特殊変数の一つである．# これは，現在のプロセス番号(PID)を表示する．# PIDは各プロセスで必ず異なるので，# シェルスクリプトで一時的なファイル名に使うことは常套手段である．# 特に，他人も書き込めるような一時作業のディレクトリなどで実行する場合，# 他人の一時ファイルと同じになることがないので安全である．## よって，sacのwコマンドで一時ファイルtmp$$にデータを出力している．# alphaは「アスキーファイル」で出力する、の意．set 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$$# 一時ファイルの削除 #