生命科学のためのLinuxシェルコマンドの基本1 【リダイレクトとオプション】

バイオインフォマティクス解析を行う時には、Linuxベースのコマンドを使うことが避けて通れません。

前回の記事では超基本として6つのコマンドを紹介しました。この記事ではその続きとして、ファイルに出力する方法とコマンドのオプションについて最低限をまとめます。

標準入出力とリダイレクト

catコマンドを使うとファイルをターミナル (標準出力と呼ばれています) に出すことができます。例えばprotein1.fastaというファイルを読み込み、その内容を標準出力に表示するには

cat protein1.fasta

200709 1

catには複数のファイルを渡すこともできます。protein2.fastaというファイルも一緒に渡してみます。

cat protein1.fasta protein2.fasta

すると、protein1.fastaとprotein2.fastaの2つのファイルの内容が標準出力であるターミナルに表示されます。

これまでは単に標準出力に表示するだけでしたが、出力先を標準出力ではなく例えばファイルに変更する (リダイレクト) こともできます。これには > という記号を使います。

例えば、先ほどと同様に2つのファイルを読み込み、新しいファイル (proteins.fasta) として出力するにはこのように書きます。

cat protein1.fasta protein2.fasta > proteins.fasta

実際にこのファイルを見てみましょう。catコマンドを使って

cat proteins.fasta

でもいいですのですが、ここではlessというコマンドを紹介します。

less proteins.fasta

今回のデータではどちらでもほとんど同じですが、バイオインフォの実際のデータはずっと大きいファイルになり、catコマンドではそれらを全て表示するので目で追うことは不可能です。一方lessコマンドは、画面にいっぱいになったところで読み込みがいったん止まるため、どのようなデータなのかを簡単に見たいときにはlessコマンドの方が向いています

新しく作られたproteins.fastaという名前のファイルの中にもともとの2つのファイルprotein1.fastaとprotein2.fastaの結果が書き込まれていることが分かります。

lessコマンドを終了してもとのターミナルに戻るにはqを押します。

リダイレクトの記号として > を紹介しましたが、これを2つ重ねた>>という記号もあります。>の場合はファイルを新規につくるということですが、>>を使うと追記することができます

cat protein1.fasta protein2.fasta >> proteins.fasta

同じようにlessコマンドで中身を確認します。

less proteins.fasta

先程のファイルに加えて、新たにprotein1.fastaとprotein2.fastaの内容が追記されていることが確認できます。

コマンドのオプション

Linuxコマンドにはさまざまなオプションがあり、それらを使ってコマンドの挙動をいろいろカスタマイズできるようになっています。

前回の記事バイオ研究のためのLinuxシェルコマンド超入門 【まずはこの6コマンドから】ではlsコマンドを紹介しましたが、このlsコマンドを題材に、オプションの設定方法を紹介します。

lオプションをつけて、ls -l の形にすると、より詳しい情報を得ることができます。例えば先程作成したzea-protein.fastaファイルについて詳しく知りたければ

ls -l proteins.fasta

のように書きます。

lsコマンドのオプションにはl以外にも rやtなどたくさんのものがあります。オプションは1つしか付けられないわけではなく複数を同時につけることも可能です。

例えば、l, r, tのオプションを全てつけるなら

ls -l -r -t

のように書くことができます。ただこの書き方だとオプションが増えたときに大変なので、これらをまとめて

ls -lrt

とする方が一般的です。各コマンドにはたくさんのオプションが用意されていますが、それらを覚えるのではなく必要な時に調べられるようにしておけばOKです。

例えばこちらのページをみると、rは逆順 (reverse), tは時間 (time) を意味することが分かります。つまりこのコマンドは、更新時間が逆順、つまり新しいファイルが上にくるようにして表示するオプションだと言えます。

なお、オプションの並べ方は順不同なので、例えば

ls -tlr

でも

ls -trl

でも同じ結果になります。

警告のリダイレクト

lsコマンドで存在しないファイルについての情報を表示しようとしてみます。

ls -l protein1.fasta protein10.fasta

protein10.fastaというデータは存在しないため、エラーが出てきました。

先程ターミナルではなくファイルにリダイレクトする>を紹介しましたが、>はエラーに関してはリダイレクトされません。Linuxの中ではエラーは別の扱いになっていて、代わりに2>という記号でリダイレクトさせることができます。

例えば、通常はstandard_out.txtにリダイレクトさせるが、エラーが発生した場合にはstandard_error.txtにリダイレクトさせたい場合には

ls -l protein1.fasta protein10.fasta > standard_out.txt 2> standard_error.txt

と書きます。できたファイルを見てみると、standard_out.txtにはprotein1.fastaの詳細 (lsコマンドの結果) がリダイレクトされていて、standard_error.txtにはprotein10.fastaというファイルが存在しないというエラーが書かれています。

このようにエラーをそれ以外と切り分けるために2>という記号を使うのです。

Linuxではfile descriptorと呼ばれる数字が割り当てられ、標準入力が0で標準出力 (ターミナル)が1, 標準エラーが2になっています。2>の2というのは、file descriptorの2を意味しています。

また、追記させるための記号>>を紹介していますが、もちろんこれのエラー版も存在し、2>>と書きます。バイオインフォ解析ではそれほどたくさん出てくるわけではありませんが、頭の片隅には入れておいたほうがいいと思います。

まとめに代えて

この記事では、単に画面に表示するだけではなくファイルに出力するために必須なリダイレクトの概念の最小限をまとめました。

また、コマンドにはさまざまなオプションがあることも紹介しています。

これらはRNA-seqのようなデータ解析を行う上でも必須事項ですので、実際にコードを動かして確認してみてください。

関連図書

この記事に関連した内容を紹介しているサイトや本こちらです。

バイオ研究のためのLinuxシェルコマンド超入門 【まずはこの6コマンドから】

生命科学のためのLinuxシェルコマンドの基本2【パイプとコマンド置換】

今日も【生命医学をハックする】 (@biomedicalhacks) をお読みいただきありがとうございました。当サイトの記事をもとに加筆した月2回のニュースレターも好評配信中ですので、よろしければこちらも合わせてどうぞ