2012年6月28日木曜日

シェルスクリプト内でaliasを使う

例えば、.bashrc に
alias rm='rm -i'
と記述してあっても、
シェルスクリプト(test.bash)内で
#!/bin/bash
rm abc.txt
として
bash test.bash
としても、問答無用でファイルが削除されてしまる。

test.bash を呼び出したときには .bashrc が呼ばれないのが原因らしい。

そこで、.bashrc を読んでaliasを有効にするために
#!/bin/bash
shopt -s expand_aliases
source ~/.bashrc
rm abc.txt
とすると、ちゃんとabc.txtを削除するときに確認メッセージが出る。

2012年6月27日水曜日

SACとアスキーの変換

追記 2015/06/10

SACとはIRISが配布してる地震波の解析をするためのツール。
http://www.iris.edu/software/sac/manual.html

簡単にプロットしたいときとかフィルターとか、地震波に限らずいろいろ便利だから、アスキーファイルとの変換について。

SAC ファイルのフォーマットは上のページで公開されてるから、それにしたがって単純にファイルの読み書きをするファイルを java で作ってみた。

その jar ファイル。
SacTool.jar

参考までに使い方は
.bashrc とかに

SACTOOL={ダウンロードしたSacTool.jarのフルパス}
alias sac2ascii='java -cp $SACTOOL SacToAscii'
alias ascii2sac='java -cp $SACTOOL AsciiToSac'

と記述する。
source .bashrc
と設定を有効にしたのちに、SAC からアスキーへは
sac2ascii {SAC ファイル名} {変換後のアスキーファイル名}
アスキーから SACへは
ascii2sac {アスキーファイル名} {変換後の SAC ファイル名}
とする。

ちなみに、SAC からアスキーに変換するとき3つ目の引数に整数値を指定すると、その数に1つの割合でしか値を変換しないようにする。
これは、GMT とかでプロットするためだけに SAC からアスキーに変換したいけど、重くなるから間引いてプロットしたい場合に役立つ。
ただし、デシメーションフィルタはかけずにそのまま間引いてるので、処理する際には注意が必要。。

sac2ascii {SAC ファイル名} {変換後のアスキーファイル名} {間引きの間隔}

例えば間引きの間隔を 4 にすると、データサイズは4分の1になる。

追記 2015/06/10 ----
GMT の psxy コマンドはバイナリファイルが読めることを知ったので、
sac からpsxy用バイナリに変換するプログラムを追加した。
単精度で書き出しているので、psxy を使う際に "-biS" オプションを付ける。

現在、使用可能なクラスは

・アスキー → sac
 AsciiToSac <asciiFileName> <sacFileName>

・KiK-netアスキー → sac
 KiknetToSac <KiknetFileName> <SacFileName>

・sac → アスキー
 SacToAscii <sacFileName> <asciiFileName> (sampleStep)

・sac → アスキー(0位相バタワース型バンドパスフィルタをかける)
 SacToAsciiBP <sacFileName> <f1> <f2> <order> <asciiFileName> (sampleStep)

・sac → アスキー(バンドパスフィルタ適用後、2乗エンベロープにする)
 SacToAsciiEnv <sacFileName> <f1> <f2> <order> <asciiFileName> (sampleStep)

・sac → バイナリ(単精度)
 SacToBin <sacFileName> <binaryFileName> (sampleStep)

・sac → バイナリ(0位相バタワース型バンドパスフィルタをかける)
 SacToBinBP <sacFileName> <f1> <f2> <order> <binaryFileName> (sampleStep)

・sac → バイナリ(バンドパスフィルタ適用後、2乗エンベロープにする)
 SacToBinEnv <sacFileName> <f1> <f2> <order> <binaryFileName> (sampleStep)

(sampleStep) はオプション(省略は 1 と等価)。

----

2012年6月26日火曜日

GMTでプロットするときにデータを区切る

例えば1つ目のデータ(data1.txt)が
1 5
2 3
3 8
2つ目のデータ(data2.txt)が
1 9
2 6
3 1
となっている場合を考える。
このとき、
psxy data1.txt -JX4/4 -R0/4/0/10 -Ba2f1::nSeW -W1p/0/0/0 -P -K > out.ps
psxy data2.txt -J -R -W1p/0/0/0t6_4:0 -P -O >> out.ps
とすると


となる。

この2つのデータを1つにまとめたファイル(data.txt)をプロットしたい場合には
1 5
2 3
3 8
>
1 9
2 6
3 1
のフォーマットでデータファイルを作成し、psxy のオプションに -M を付ける。
ちなみに、この区切りの > はデフォルトらしいけど、変え方は知らない。。

psxy data.txt -JX4/4 -R0/4/0/10 -Ba2f1::nSeW -W1p/0/0/0 -M -P > out.ps
とすると、さっきと同じような図ができる。線の種類は変えられないみたい。


この区切りを指定しなかった場合には、すべての点が一筆書きでつながって一本の線になってしまう。

2012年6月22日金曜日

Pythonの算術演算

後で調べるために残しておくメモ。。


0 から π までの要素数 n 配列を作りたい場合
array = numpy.arange(n)*numpy.pi/float(n)
とする。



最初に結果がおかしいと思っていたのは
array = numpy.arange(n)
array *= (numpy.pi/float(n))
これだと array の中身は整数値のみ。つまり0, 1, 2, 3のみ。
なぜだろう。。

2012年6月21日木曜日

rsyncでディレクトリのコピー

基本的な構文は
rsync -a {コピー元} {コピー先}
-a オプションはディレクトリを再帰的にコピーしたり、ファイルの情報を保持したままコピーするからとりあえず付けとく。



具体的には ディレクトリ /abc/def/ に file1, file2, file3 というファイルがあって、それを /uvw/xyz/ にコピーする場合
rsync -a /abc/def/ /uvw/xyz/
だと
uvw---xyz---file1
               |-file2
               |-file3
となる。



コピー元の最後に / を付けないで
rsync -a /abc/def /uvw/xyz/
とすると
uvw---xyz---def---file1
                      |-file2
                      |-file3
となり、def ディレクトリもコピーされる。

ちなみに、コピー先の / はあってもなくても同じ。

2012年6月20日水曜日

bashで複数行のコメントアウト

一行だけのときは
#{処理}
とすればいい。

複数行の時は
: << '#COMMENT_OUT'
  {処理}
#COMMENT_OUT
とすればいい。

bashでファイルを一行ずつ読み込む

while read line; do
  echo $line
done < {ファイル名}

読み込んだラインを分割したい場合には
var=`echo $line | cut -d ',' -f 2`
これは、区切り文字が , (カンマ)で、2つ目の文字列を var に入れるとき。

awkを使って
awk '{print $2}' {ファイル名}
でも同じかな。

2012年6月19日火曜日

GMTでの日時の取り扱い

追記 2013/02/18

"gmtdefaults"の中身をチェックする。

INPUT_CLOCK_FORMAT = hh:mm:ss
INPUT_DATE_FORMAT = yyy-mm-dd

となっている場合、ファイルの時間軸は

yyyy-mm-ddThh:mm:ss


と指定する。

プロットするときの R オプションは

R2001-01-01T00:00:00/2010-12-31T23:59:59/{min}/{max}

と指定する。{min}と{max}は表示するデータ値の最小値と最大値。

B オプションは、1年ごとに数字、1か月ごとに目印を入れる場合

Ba1Yf1o

とする。大文字のYだと2004みたく4桁表示。小文字だと04になる。
o は月を表す。

B オプションの詳細は
http://gmt.shin-gen.jp/GMT4.1.4/psbasemap.html


追記 2013/02/18 -----
通年日を指定する場合には jjj を使う。
つまり、

yyyy-jjj

といった感じ。
-----