csh って何?
現在調査中。
何が便利?
一昔前はCCP4もスクリプトを書いて使っていました。CCP4インストール環境で
$ ls $CEXAM/unix/runnable/
などとやってみると、その歴史が見て取れるでしょう。このようなスクリプトを書くことのメリットは
- 似たような計算を繰り返しやる
- やった仕事はスクリプトとログを見ればわかる
などかと。これらは他のスクリプトでもいえることですが。cshはもともとUNIX/LINUX環境でよく使われているのでどんなLINUX OSでも(たぶん)入っているはず。
なので使いたいと思ったらすぐに使えるもので、ちょっと癖があるけど、ちょっとしたときに便利、という位置づけ。
後はてきとうに拙作スクリプトを御覧いただきつつ説明いたします。
HKL2000 .scaファイルから格子定数を抜きとろう
<スクリプト>
#!/bin/csh head -3 output.sca | tail -1 | awk '{print $1,$2,$3,$4,$5,$6}'
説明の前に
- HKL2000 .scaファイルには格子定数の情報がかかれている
- 格子定数の情報は上から3行目にかかれている
- 格子定数の情報の後ろには空間群の文字列がかかれている
スクリプトの説明
head -3 の部分
コマンドheadはテキストファイルの”頭”を標準出力(モニタ)に表示する、という機能を持つ。
例えば test.txtに
BBBBBBBBBBBB IIIIIIIIIIII OOOOOOOOOOOO KKKKKKKKKKKK IIIIIIIIIIII DDDDDDDDDDDD
と書いてあったとしましょう。
$ head -3 test.txt
とするとモニタには
BBBBBBBBBBBB IIIIIIIIIIII OOOOOOOOOOOO
と表示されることでしょう。-(ハイフン)によって頭からの行数を指定するのです。指定しなければ各デフォルト行数表示。
tail -1 の部分
コマンドtailはテキストファイルの”最後”を標準出力に表示する機能を持つ。
上記のtest.txtについて
$ tail -1 とすると最後から1行目のみ
DDDDDDDDDDDD
と表示されるし、
$ tail -2 とすると最後から2行目まで IIIIIIIIIIII DDDDDDDDDDDD
表示されるはず。
| (パイプ)
パイプの機能については全て説明しかねますが、コマンドとコマンドをつなぐ作業をするもの、と覚えましょう。 実際に見たほうがわかりやすいので上の例で説明します。
$ head -3 test.txt
とすると結果は
BBBBBBBBBBBB IIIIIIIIIIII OOOOOOOOOOOO
ですね? では、上のコマンドにパイプでtailを入れるとどうなるか?
$ head -3 test.txt | tail -1
OOOOOOOOOOOO
となります。わかりにくいかもしれませんが、"head -3 test.txt" の結果、にたいして tail が発動したと。そういうことになりますね。もうひとつ例を見ればわかりますよキット。
$ head -3 test.txt | tail -2
IIIIIIIIIIII OOOOOOOOOOOO
と。和訳すると「test.txtの上から3行のうち、けつから2行を標準出力に出して」ってことになります。
awk '{print $1,$2,$3,$4,$5,$6}'
awk については他の部分で説明したのがよい気がしますので、簡単に流します。
この行を和訳すると 「'head -3 output.sca | tail -1'で出力した'行'のうち前から6文字列を標準出力に表示して」ということになります。
P43212 Lysozymeを mergeした場合のSCAファイルだと格子定数がある行というのは
78.883 78.883 37.076 90.000 90.000 90.000 p43212
となっています。p43212の部分は格子定数だけが必要な場合、出力してほしくない、と。
その場合、前から6個(スペースで区切られている必要がある(はず))の文字列だけを出力したい場合、こう書きます。
awkは簡単な計算や文字列処理など、機能は豊富です。ただ、使いづらいので、その手間をかけるなら、他のスクリプトを覚えた方が後々便利だと思います。
ただし、上記のように必要な文字列情報をフォーマットして抜き出すことが簡単なので、このくらいの記述を覚えておけば、やっつけスクリプト処理作業が簡単になることが多いです。さしあたりこの表現だけ覚えましょう。
このスクリプトのまとめ
結局最初に書いたスクリプトの和訳は
「HKL2000 .sca ファイルの頭から3行のうち、けつから1行の、前から6個めまでの文字列を表示してね」~
だということがわかりますでしょうか。意訳すると
「HKL2000 .scaファイルの中の格子定数が書いてある行(3行目)の前から・・・」~
ってことになります。
例えばこのスクリプトはHKL2000が計算した格子定数情報を単品で保存しておく、ということに使います。
$ head -3 output.sca | tail -1 | awk '{print $1,$2,$3,$4,$5,$6}' > cell.txt
とすると、cell.txt というファイルに
78.883 78.883 37.076 90.000 90.000 90.000
が保存されます。~
自動的にいくつかのモデルを使って分子置換したい、などの仕事をするときにMR部分のスクリプトを書いたとします。そのときにどうせ格子定数は必要です。そういう場合には自分の手で格子定数を抜き出してスクリプトに書き込むよりも人為的ミスは回避しやすいですよね。
また、計算中に格子定数がわからなくなったときなど、すぐに使えてべんりでしょう?
というようなメリットが csh スクリプトにはある、というお話でした。