UNIX for Bioinformatics

2. コマンド(基礎編)

UNIX コマンドは数十種類あるが、よく使うコマンドは限られている。よく使うコマンドを次の表にまとめた。使い方をこれから練習していけばよいが、はじめはこれらのコマンドを語学でいう単語だと思って、暗記しておくことよい。

コマンド機能
pwd現在作業しているディレクトリのパスを表示する。
lsディレクトリの内容の一覧を表示する。
cdディレクトリを移動する。
cpファイルまたはディレクトリをコピーする。
mvファイルまたはディレクトリを移動する。
mkdir空のディレクトリを作る。
rmファイルを削除する。
rmdir空のディレクトリを削除する。
wcファイル内容の行数・文字数などを表示する。
catファイルの内容を表示する。
lessファイルの内容あるいは標準入力を少しずつ確認する。
grepファイルの内容あるいは標準入力に対して文字列検索を行う。
cutファイルの内容あるいは標準入力の特定の列を切り出す。
sortファイルの内容あるいは標準入力に対して値をソートする。
uniqファイルの内容あるいは標準入力に対して重複値を消去する。
echo標準出力に文字列を出力する。
>リダイレクト。標準出力される内容をファイルに保存する。
|パイプ。| 左側の標準出力を|右側に標準入力として与える。

 

pwd

pwd (print working directory) コマンドは、現在の作業ディレクトリの絶対パスを表示するコマンドである。CLI 操作ではコンピュータの画面を見ながら操作ではないため、ユーザー自身が常に自分がどこのディレクトリで作業しているのかを把握する必要がある。しかし、ディレクトリ間の移動や様々な操作を行っているうちに、現在の作業ディレクトリを把握できなくなることもある。このとき、pwd コマンドを利用すると、現在のディレクトリの絶対パスを確認できる。

ターミナルを起動して、pwd コマンドを実行してみてください。ターミナルを起動した直後は、作業ディレクトリがホームディレクトリとなっているため、pwd コマンドを実行すると、Linux および WSL (Ubuntu) の場合は次のように表示されるはずである。"donguri" はユーザー名で、人によって異なる。

macOS の場合は次のように表示される。Linux と macOS のディレクトリ構造はやや異なるが、今回のコマンドやシェルの練習に影響を及ぼさない。ただし、macOS を使用する場合、以下を読み進めるときに、"/home" を "/Users" に読み替えてください。

 

ls

ls (list) コマンドは、ディレクトリの内容をリストアップして表示するコマンドである。CLI 操作では、コンピュータの画面が見えないゆえ、ディレクトリの中にどんなファイルが保存されているのかを把握しにくい。ls コマンドを使用することにより、ディレクトリの中にどのようなファイルがあるのか。また、どのような子ディレクトリがあるのかを確認できるようになる。

ターミナルを起動して、次のコマンドを実行してみてください。この例では pwd コマンドは現在の作業ディレクトリの絶対パスを出力し、ls コマンドは現在の作業ディレクトリの内容を表示している。ls コマンドの出力結果は、システムの種類やユーザーによって異なる。

上のホームディレクトリでの ls の実行結果に unix4bi ディレクトリが含まれていることを確認してください。unix4bi が含まれていない場合は、データの準備作業のところをもう一度実行してください。

ls コマンドの後ろにパスを加えると、そのパスに存在しているディレクトリの内容が一覧として表示される。試しに、ルートディレクトリの内容を出力させてみる。ルートディレクトリの出力結果もシステムの種類やユーザーによって異なる。

次に、準備作業でダウンロードした unix4bi ディレクトリの中身を出力してみる。pwd を利用して現在のディレクトリパスを確認し、現在のディレクトリに含まれる unix4bi ディレクトリの中身を出力したい。unix4bi ディレクトリパスを次のようにする。

現在作業しているディレクトリ(/home/donguri)に unix4bi が存在している。つまり、コンピュータにとって、現在の作業ディレクトリから unix4bi ディレクトリが「見える」。コンピュータが目的のディレクトリを直接「見える」とき、次のようにして、絶対パスを書かなくてもよい。

このように絶対パスを使う代わりに、現在作業しているディレクトリから見え方で、ディレクトリのパスを記述することもできる。このような方法で記述するパスのことを相対パスと呼ぶ。

cd

cd (change directory) コマンドはディレクトリの移動に使用するコマンドである。マウスを利用した GUI 操作では、フォルダをダブルクリックして、中身を確認して、対象の子フォルダをさらにダブルクリックして開く、といった操作を繰り返して、目的のフォルダにたどり着くことができる。CLI 操作では、pwd コマンドで現在の場所を確認して、ls コマンドで現在のディレクトリの中身を確認して、cd コマンドを使って子ディレクトリに移動する。cd コマンドを使って移動する場合は、cd コマンドの後ろに移動先のパスを書く。パスは、絶対パスでも相対パスでもよい。

準備作業でダウンロードした unix4bi ディレクトリの構造は、ルートから書き始めると次のようになっている。"???" は、練習問題で使用するため、ここでは中身を明記しない。この unix4bi ディレクトリを使用して cdlspwd の練習を行ってみる。

/
donguri
unix4bi
data
samples
projects
fastq
pdb
field_data
iris.txt
iris.csv
yield_data
???
???
???
murphys_law.txt
mouse
athaliana
???
README.md
genome.fa
genome.gff

まず、unix4bi の中に移動して、その中身を ls で確認してみる。次のスクリプトのうち、1 行目の cd コマンドには移動先のパスが書かれていない。このとき、システムはホームディレクトリ("/home/donguri")に移動する。パスの書かれていない cd コマンドを使用することですばやくホームディレクトリに移動できるため、迷ったときあるいはホームディレクトリに戻りたいなどのときに使うと便利である。2 行目以降のスクリプトでは、unix4bi ディレクトリに移動して、パスを確認して、中身を確認していることになる。

次に、data ディレクトリに移動して、その中身を ls で確認してみる。現在の作業ディレクトリから data ディレクトリが見えるため、次のように cd コマンドを実行すると、data ディレクトリの中に移動することができる。

続けて、data ディレクトリから出て、unix4bi ディレクトリの下の projects ディレクトリの下にある athaliana ディレクトリに移動してみる。data ディレクトリから athaliana ディレクトリに移動するには、(上のディレクトリのツリー構造を参考にして、)

  1. data ディレクトリの 1 つ上の層(ディレクトリ)に移動し、
  2. projects ディレクトリに移動し、
  3. 最後に athaliana ディレクトリに移動する

の 3 ステップが必要である。1 つ上の層に移動するためには .. を使用する。

ディレクトリの移動を上のように cd コマンドを 3 回使って行ってきたが、実際は次のようにコマンド 1 回だけで移動することもできる。その際に、区切りとして '/' を使う。

../projects/athaliana のように、現在の作業ディレクトリ(pwd)から相対的に見て、ディレクトリの場所を記述する方法は相対パスと呼ばれる。cd コマンドの後ろに絶対パスを使っても、相対パスを使っても同じ結果が得られる。次のスクリプトでは、初めの部分は相対パスを使って athaliana フォルダに移動する例であり、後の部分は絶対パスを使って移動する例である。

ls コマンドには様々なオプションが用意されている。オプションを使用するには ls コマンドのあとに - をつけてオプションを指定する。例えば -lh オプションを使用すると、ファイルの所有者、サイズやファイルの更新日などの情報を確認できる。

 

練習問題 C1

問題 C1-1

projects ディレクトリ下にある mouse ディレクトリの絶対パスを答えよ。

問題 C1-2

mouse ディレクトリに何件のファイルが含まれているのかを答えよ。また、各ファイルのサイズを答えよ。

問題 C1-3

mouse ディレクトリから、相対パスを使用して、data ディレクトリの下にある field_data ディレクトリに移動するコマンドを書け。

cp

cp (copy) コマンドはファイルのコピーを行うコマンドである。ファイルをコピーするには、コピー元とコピー先を指定する必要がある。cp コマンドを使用するとき、コピー元、コピー先の順で指定する。コピー元およびコピー先のパスは、絶対パス・相対パスのどちらでもよい。

次のスクリプトは、athaliana ディレクトリに移動して、その中にある genome.gff ファイルコピーして、gene_annotation.gff の名前で保存する例を示している。ファイルをコピーしただけであるので、ファイルのサイズに変化はなく、ファイルの更新日が現在時刻になる。

この例では同じディレクトリの中で、ファイルのコピーを行っている。ディレクトリを跨ぐコピーも同様に行うことができる。次のスクリプトは、athaliana ディレクトリの中にある genome.gff ファイルを data ディレクトリの中にコピーする例を示している。コピー後、ls コマンドで確認すると、確かに data ディレクトリの中に genome.gff ファイルが存在していることを確認できる。

このように、コピー先のパスをディレクトリ名(例:data/)で指定することで、同名のファイルのコピーが指定先のディレクトリに保存される。これに対して、コピー先のパスをファイル名まで詳しく記述すると、コピーされたファイルは、指定されたファイル名で保存される。例えば、athaliana ディレクトリにある genome.gff ファイルを、data ディレクトリの下に、gene_annotation.gff の名前でコピーする場合は次のようにする。

ディレクトリのコピーを行う場合は -r オプションを付ける必要がある。-r は再帰的という意味であり、ディレクトリの中にある子ディレクトリやファイルも同様にコピーすることを意味する。例えば、data ディレクトリをまるごとコピーして、data_backup というディレクトリ名で保存する場合は次のようにする。

mv

mv (move) コマンドは、ファイルおよびディレクトリの移動を行うコマンドである。基本的に cp コマンドの使い方と同じであり、移動元と移動先を指定する必要がある。cp はコピーを作るコマンドであるため、コピー先には、コピー元と同一内容のファイルが新たに作られる。これに対して、mv コマンドは(コピーではなく)ファイルの移動を行うため、移動元からファイルが失くなる。次の例は、pdb ディレクトリの中になる 1alk.fa ファイルを samples ディレクトリの下に移動する例を示している。

cp コマンドのように移動先のパスをファイル名まで詳細に書けば、ファイル名の変更しながら移動ができるようになる。この操作は見かけ上、ファイル名の変更処理にあたる。次の例は samples フォルダの中にある 1alk.fa を 1alk.fasta という名前に変更する例を示している。

mkdir

mkdir (make directory) コマンドは空のディレクトリを作成するコマンドである。作成したいディレクトリのパスを与えて実行する。例えば、次の例では、unix4bi ディレクトリの下に textdata という空ディレクトリを作成する場合は次のようにする。

rm

ファイルを削除する場合は rm (remove) コマンドを使用する。削除したいファイルのパスを rm に与えて実行する。例えば、data ディレクトリにある genoem.gff および gene_annotation.gff ファイルを削除する場合は次のように実行する。data ディレクトリの外から相対パスを指定して削除することも、data ディレクトリの中に入ってファイル名(相対パス)を指定して削除することもできる。

rm コマンドで削除されたファイルは基本的に復元できない。GUI 操作のようにファイルがゴミ箱に一時保存されるのではなく、rm コマンドの場合は、ファイルをそのまま削除してしまうことに注意。また、rm コマンドは、そのままではディレクトリを削除することができない。

rmdir

ディレクトリを削除するには rmdir (remove directory) コマンドを利用する。ただし、ディレクトリの内部にファイルや子ディレクトリがある場合は、それらのファイルを予め rm で削除しておく必要がある。次の例は、samples ディレクトリを samples2 の名前でコピーしてから、samples2 を削除する手順を表している。

このように、削除したいディレクトリの中に入っているファイルをあらかじめ rm コマンドですべて削除してから、最後に rmdir コマンドで空となったディレクトリを削除する。始めから rmdir コマンドを実行するとエラーが起きて、何も起こらない。

ディレクトリの中にファイルが含まれているときに、ファイルとディレクトリを一括で削除たい場合は rm -rf samples のようなコマンドを使用する。ただし、このコマンドは非常に危険で、パスの指定を間違えると、大事なデータや自作プログラムなどを消去してしまうため、初心者はこのコマンド(rm -rf)を使わないのようにしてください。

練習問題 C2

問題 C2-1

unix4bi ディレクトリに backup ディレクトリを作成し、backup ディレクトリの中に athaliana ディレクトリおよび mouse ディレクトリをコピーせよ。

問題 C2-2

問題 2-1 で作成した backup ディレクトリを削除せよ。

問題 C2-3

samples ディレクトリにある murphys_laws.txt ファイルのコピーを law_of_murphy.txt の名前で作成せよ。また、作成した law_of_murphy.txt を unix4bi ディレクトリの下の data ディレクトリに移動せよ。

 

wc

wc (word count) コマンドはファイルの行数、単語数および文字数を数えるコマンドである。例えば、samples ディレクトリの中にある murphys_law.txt ファイルに対して行数、単語数、文字数を調べるには次のようにする。

wc コマンドは 3 つの数値を出力値、順に行数、単語数、文字数を表す。murphys_law.txt ファイルの場合、21 行、193 個の単語、および 1,096 文字からなる。wc は、単語数の定義が曖昧であるが、行数を数えるのに非常に便利なコマンドである。

cat

ファイルの内容を実際に確認したい場合は、headtail、および cat (concatenate) コマンドを利用すると便利である。head および tail コマンドはファイルの先頭 10 行および後尾 10 行だけを出力するコマンドである。cat コマンドはファイルの中身をすべて出力するコマンドである。次は、samples ディレクトリにある murphys_law.txt ファイルの中身を出力させる例である。

なお、head および tail コマンドにオプション -n を付けることによって、最初の 5 行あるいは最後の 5 行のように行数を指定できる。

cat コマンドにオプション -n を付けることによって、ファイルの内容は行数と共に表示される。

less

less コマンドは cat コマンドと同じくファイルの内容を表示するコマンドである。cat コマンドは、ファイルの内容を一括に出力するが、less コマンドは、ファイルの内容を少しずつ(less)出力する。次は、athaliana ディレクトリの下の genome.gff ファイルの中身を確認する例である。

less を実行すると、ファイルの内容が画面上に表示される。このとき、キーボードを使って、ページめくりや検索などを行うことができる。よく使うキー制御に次のようなものがある。

キー動作
Enter/Return次の行に移動
y前の行に移動
SPACE次のページに移動
b前のページに移動
gファイルの先頭に移動
Gファイルの後尾に移動
/apple今の位置より後ろの内容に対して文字列 "apple" を検索
?apple今の位置よりも前の内容に対して文字列 "apple" を検索
n次の検索ヒット箇所に移動
N前の検索ヒット箇所に移動
q終了

less コマンドを終了させたい場合は、キーボードで q キーを入力する。多くのコマンドやプログラムでは q は終了を意味するので、コマンドやプログラムから出られなかったら q キーを入力してみてください。

grep

grep (globally search for a regular expression and print matching lines) コマンドはテキストファイルに対して検索を行うコマンドである。例えば、athaliana ディレクトリにある genome.gff ファイルの中に、遺伝子 AT1G65480 の情報だけを検索したい場合は次のようにする。

オプション -n を付けると検索でヒットした行の行番号が出力される。

オプション -v を付けると、検索でヒットしなかったが出力される。次は、AT1G65480 を含まない行を出力している例を示している。

grep コマンドの機能は多様である。例えば、複数のファイルに対して一括に検索して、検索キーワードを含むファイル名を出力したり、あるいは含まないファイル名を出力したりする機能もある。grep コマンドに少し慣れたところで、これらの機能を探して使ってみてください。

> (リダイレクト)

> (redirection) は画面上に出力される情報をファイルに出力させたいときに使用するものである。catwcgrep などのコマンドを実行すると、その実行結果が画面上に表示される。これらの実行結果をファイルに保存させるときに > を使用する。次サンプルコードは、athaliana ディレクトリにある genome.gff の内容のうち、mRNA_TE_gene を含む行のデータだけを抽出して、TE_gene.gff に保存する例を示している。

違う例を実行してみる。athaliana ディレクトリにある genome.gff の内容のうち、mRNA_TE_gene を含む行のデータだけを除いて、それ以外の全データを new_genome.gff に保存してみる。

| (パイプ)

| (パイプ)は複数のコマンドを繋げて実行したいときに使用する。例えば、grep コマンドでテキスト検索を行い、その検索結果を(ファイルに保存しないで)そのまま wc コマンドに渡して、行数や文字数を数えたい場合に使用する。ここで、athaliana ディレクトリにある genome.gff の内容のうち、mRNA_TE_gene を含む行だけを grep コマンドで抽出して、これらのデータに含まれる文字数などの情報を wc コマンドで調べてみる。

上の例では、2 つのコマンドを | で繋げて実行している。実際には複数のコマンドを繋げて実行することもできる。例えば、キーワード Chr1 かつ tRNA を含む行を抽出するには次のように、grep| で繋げて書く。このとき、2 番目の grep への入力は | の左側から流れてくるため、grep にはファイルのパスを指定する必要はない。

画面上に多くの情報が出力される。情報が多くて確認しにくいため、ここでは、上のコマンドの出力結果に対して、さらに wc コマンドを実行させて、行数や文字数を調べてみる、

このように、| を有効に使うことで、中間ファイルを作らずに解析を進めることができるので、非常に効率がよい。

また、head コマンドと tail コマンドを | で繋ぐことで、例えば、ファイルの 5 行目から 10 行目までの内容を表示する、といった作業ができるようになる。

 

練習問題 C3

問題 C3-1

samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルの行数、および単語 "is" を含む行の行数を答えよ。

問題 C3-2

samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルの 8 〜 15 行目のうち、単語 "is" を含む行は何行あるかを答えよ。

問題 C3-3

samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルのうち、単語 "will" かつ "go" の両方を含む行の行数を答えよ。

問題 C3-4

samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルのうち、単語 "will" かつ "go" の両方を含む行の内容を text2.txt ファイルに保存せよ。

問題 C3-5

samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルのうち、単語 "will" を含む、かつ "go" を含まない行の行数を答えよ。

 

echo

echo コマンドは何らかの文字列を画面上に出力するコマンドである。他のプログラミング言語の print 関数の働きに似ている。

echo コマンドは文字列を画面上に出力するが、リダイレクトを使用するとで、ファイルに保存することもできる。

上のコードを見ると、2 回目の echo > を実行した後に、hello_world.txt ファイルには "(^_^) /~~" しか含まれていないことが確認取れる。これは、2 回目の > を使ったときに、同名のファイルがすでに存在する場合は、それを廃棄して、ファイルを新規作成されてしまうためである。echo コマンドを複数回実行して、複数の文字列を同じファイルに書き込む際に、2 回目以降は、追加書き込み用の >> を使用する必要がある。

cut

cut コマンドは、整理されたタブ区切りのファイルから特定の列(フィールド)を切り出して表示するコマンドである。TSV や CSV ファイルの特定の列を繰り出す際によく利用する。

athaliana ディレクトリの中にある genome ファイルはタブ区切りのデータとなっている。実際に、このデータの中から、3 列目を切り出して表示させてみる。ただし、スペースの紙面の関係で、ここでは head コマンドで最初の 5 行のみを表示する。

複数の列を切り出すこともできる。

CSV ファイルの場合は区切り文字が , となっている。CSV ファイルに対して cut コマンドを適用したい場合は、-d オプションをつけて、区切り文字を , に設定する必要がある。

sort

sort コマンドは、整理されたタブ区切のファイルの特定の列の値に従って、ファイルの行を並べ替えるコマンドである。sort コマンドはデフォルトでは文字列として並べ替えるが、オプション -n を付けることによって、数値として並べ変えることもできる。例えば、10, 1, 5, 100, 50 を文字列として並べるときは、1, 10, 100, 5, 50 となるが、数値として並べ替えるときは 1, 5, 10, 50, 100 となる。数値として並べ替えたいときはオプション -n を付け忘れないようにしてください。

次は、data ディレクトリになるタブ区切りのファイル iris.txt の 2 列目(-k 2)を数値として並べ替えを行う例を示している。

オプション -r を付けることによって、逆順にすることができる。

sort コマンドには多くのオプションが用意されている。ファイルの内容を文字列としてソートしたり、数値としてソートしたりすることができる。必要なときに調べるとよい。

uniq

uniq (unique) コマンドは重複データを処理するためのコマンドである。その機能をみるために、ここで data ディレクトリ中の iris.txt ファイルの 6 行目のデータを切り出して、uniq コマンドを実行してみる。

Iris.txt は 150 行からなるデータだが、その 6 列目には setosa、versicolor、virginica の 3 種類の値しかないことがわかる。次に uniq コマンドにオプションを付けて、それぞれの値が何件分(何行)存在するかを調べてみる。

それぞれ 50 件存在することがわかった。このように、UNIX コマンドを組み合わせ使うことで、マウス操作などを行わずにデータの中身を確認したり、データを変更したりすることができる。

 

練習問題 C4

問題 C4-1

athaliana ディレクトリの中にある genome.gff ファイルはタブ区切りのファイルである。このファイルの中身のうち、"Note=tRNA" を含む行を抽出し、第 4 列目の値に応じて、降順に並べ替えよ。

問題 C4-2

athaliana ディレクトリの中にある genome.gff ファイルはタブ区切りのファイルである。このファイルの 3 列目にはどのような値が存在するのかを調べよ。また、それぞれの値が何件ずつ存在するのかを答えよ。(ヒント:uniq | sort または sort | uniq を使う。両者の結果は異なるので、正しい方を使ってください。可能であれば、両者が異なる結果を出力する理由を述べよ。)

問題 4-3

field_data ディレクトリの中にある iris.csv ファイルはカンマ区切りのファイルである。このファイルの 4 列目の値の中で、最大値を持つ行のみを出力せよ。

問題 C4-4

field_data ディレクトリの中にある iris.csv ファイルはカンマ区切りのファイルである。6 列目が versicolor となっている行のうち、5 列目の値が最小値となっている行のみを出力せよ。

問題 C4-5

field_data ディレクトリの中にある iris.csv ファイルはカンマ区切りのファイルである。setosa、versicolor、virginica の 3 種それぞれについて、2 列目の値が最大値となっている行、iris_max_sepal_length.csv という 1 つのファイルに保存せよ。

 

 

CC BY 4.0