Palmsonntagmorgen

NGSデータを使った解析と、その周辺。

DROMPA3: その5 シェル変数を使う

今日はシェル変数について。

前回の記事の「複数サンプルの可視化」の項で、以下のコマンドを実行しました。

$ drompa_draw PC_SHARP \
$ -i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
$ -i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
$ -i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
$ -p K562 -gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2

ここで、”parse2wigdir”を6回も記入するのは面倒ですので、これを変数に格納してみましょう。

$ dir=parse2wigdir
$ drompa_draw PC_SHARP \
$ -i $dir/H3K4me3,$dir/Input,H3K4me3 \
$ -i $dir/H3K27me3,$dir/Input,H3K27me3 \
$ -i $dir/H3K36me3,$dir/Input,H3K36me3 \
$ -p K562 -gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2

1行目でdirという変数に"parse2wigdir"という文字列を格納しています。 以後、$dirと指定することで"parse2wigdir"を記入したのと同じ意味になります。
(変数を定義する時には$記号がなく、参照する時には$記号が必要であることに注意)
仮にディレクトリ名が変更された場合、最初の例では6箇所修正する必要が出てきますが、このように変数に格納すると修正は1箇所で済みます。 また、「6箇所に同じ名前を利用する」という意味合いがはっきりするという意味でもこちらの方が望ましいです。

もう少し修正してみましょう。以下のようにするとどうでしょうか。

$ dir=parse2wigdir
$ s1="-i $dir/H3K4me3,$dir/Input,H3K4me3"
$ s2="-i $dir/H3K27me3,$dir/Input,H3K27me3"
$ s3="-i $dir/H3K36me3,$dir/Input,H3K36me3"
$ drompa_draw PC_SHARP $s1 $s2 $s3 -p K562 -gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2

3つのサンプルペアをそれぞれs1, s2, s3に格納し、コマンドを実行する時にそれを指定しています。 こうすると以下のようにサンプルを柔軟に選択できるようになります。

$ dir=parse2wigdir
$ s1="-i $dir/H3K4me3,$dir/Input,H3K4me3"
$ s2="-i $dir/H3K27me3,$dir/Input,H3K27me3"
$ s3="-i $dir/H3K36me3,$dir/Input,H3K36me3"
$ drompa_draw PC_SHARP $s1 -p K562_1 -gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2
$ drompa_draw PC_SHARP $s2 -p K562_2 -gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2
$ drompa_draw PC_SHARP $s3 -p K562_3 -gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2
$ drompa_draw PC_SHARP $s1 $s2 $s3 -p K562_all -gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2

3サンプル程度だとここまでする必要はあまりないのですが、数十サンプル同時に扱うような場合には威力を発揮します。

パラメータを毎回指定するのも面倒なので、統一的に使いたいパラメータも変数にしてしまいましょう。

$ dir=parse2wigdir
$ s1="-i $dir/H3K4me3,$dir/Input,H3K4me3"
$ s2="-i $dir/H3K27me3,$dir/Input,H3K27me3"
$ s3="-i $dir/H3K36me3,$dir/Input,H3K36me3"
$ param="-gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2"
$ drompa_draw PC_SHARP $s1 -p K562_1 $param
$ drompa_draw PC_SHARP $s2 -p K562_2 $param
$ drompa_draw PC_SHARP $s3 -p K562_3 $param
$ drompa_draw PC_SHARP $s1 $s2 $s3 -p K562_all $param

ずいぶんすっきりしました。 変数の数を増やしすぎると逆に読みにくくなることもあるので、どこまで変数に格納するかは個人の好みによります。

最後に、20サンプルを同時に可視化する場合を考えてみましょう。 ChIPサンプルはChIP1, ChIP2, ..., ChIP20とナンバリングされているとします。Inputサンプルは共通です。 上の例にならうと、以下のようになります。

$ dir=parse2wigdir
$ s1="-i $dir/ChIP1,$dir/Input,ChIP1"
$ s2="-i $dir/ChIP2,$dir/Input,ChIP2"
...
$ s20="-i $dir/ChIP20,$dir/Input,ChIP20"
$ param="-gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2"
$ drompa_draw PC_SHARP $s1 $s2 ... $s20 -p K562_all $param

サンプルの定義に20行も使ってしまいました。これはあまりスマートではありません。 こんな時はfor文を使うと簡単に書くことができます。何が起きているかわかるでしょうか。

$ dir=parse2wigdir
$ s=""    # 空の変数を定義
$ for i in $(seq 1 20)    # i を1から20まで順にインクリメント
$ do
$     s="$s -i $dir/ChIP$i,$dir/Input,ChIP$i"  # 変数sにサンプルを再帰的に追加
$ done
$ param="-gene refFlat.txt -gt genometable.txt -chr 1 -lpp 2"
$ drompa_draw PC_SHARP $s -p K562_all $param

このようなコマンドのかたまりをテキストファイルとして保存したものをシェルスクリプトと言います。 DROMPAの一番の弱点はコマンドが長くなってしまうことなのですが、このようにするとすっきりと記述することができますので、試してみてください。