UNIX コマンドは数十種類あるが、よく使うコマンドは限られている。よく使うコマンドを次の表にまとめた。使い方をこれから練習していけばよいが、はじめはこれらのコマンドを語学でいう単語だと思って、暗記しておくことよい。
コマンド | 機能 |
---|---|
pwd | 現在作業しているディレクトリのパスを表示する。 |
ls | ディレクトリの内容の一覧を表示する。 |
cd | ディレクトリを移動する。 |
cp | ファイルまたはディレクトリをコピーする。 |
mv | ファイルまたはディレクトリを移動する。 |
mkdir | 空のディレクトリを作る。 |
rm | ファイルを削除する。 |
rmdir | 空のディレクトリを削除する。 |
wc | ファイル内容の行数・文字数などを表示する。 |
cat | ファイルの内容を表示する。 |
less | ファイルの内容あるいは標準入力を少しずつ確認する。 |
grep | ファイルの内容あるいは標準入力に対して文字列検索を行う。 |
cut | ファイルの内容あるいは標準入力の特定の列を切り出す。 |
sort | ファイルの内容あるいは標準入力に対して値をソートする。 |
uniq | ファイルの内容あるいは標準入力に対して重複値を消去する。 |
echo | 標準出力に文字列を出力する。 |
> | リダイレクト。標準出力される内容をファイルに保存する。 |
| | パイプ。| 左側の標準出力を| 右側に標準入力として与える。 |
pwd
(print working directory) コマンドは、現在の作業ディレクトリの絶対パスを表示するコマンドである。CLI 操作ではコンピュータの画面を見ながら操作ではないため、ユーザー自身が常に自分がどこのディレクトリで作業しているのかを把握する必要がある。しかし、ディレクトリ間の移動や様々な操作を行っているうちに、現在の作業ディレクトリを把握できなくなることもある。このとき、pwd
コマンドを利用すると、現在のディレクトリの絶対パスを確認できる。
ターミナルを起動して、pwd
コマンドを実行してみてください。ターミナルを起動した直後は、作業ディレクトリがホームディレクトリとなっているため、pwd
コマンドを実行すると、Linux および WSL (Ubuntu) の場合は次のように表示されるはずである。"donguri" はユーザー名で、人によって異なる。
pwd
## /home/donguri
macOS の場合は次のように表示される。Linux と macOS のディレクトリ構造はやや異なるが、今回のコマンドやシェルの練習に影響を及ぼさない。ただし、macOS を使用する場合、以下を読み進めるときに、"/home" を "/Users" に読み替えてください。
xxxxxxxxxx
pwd
## /Users/donguri
ls
(list) コマンドは、ディレクトリの内容をリストアップして表示するコマンドである。CLI 操作では、コンピュータの画面が見えないゆえ、ディレクトリの中にどんなファイルが保存されているのかを把握しにくい。ls
コマンドを使用することにより、ディレクトリの中にどのようなファイルがあるのか。また、どのような子ディレクトリがあるのかを確認できるようになる。
ターミナルを起動して、次のコマンドを実行してみてください。この例では pwd
コマンドは現在の作業ディレクトリの絶対パスを出力し、ls
コマンドは現在の作業ディレクトリの内容を表示している。ls
コマンドの出力結果は、システムの種類やユーザーによって異なる。
xpwd
## /home/donguri
ls
## Desktop Downloads Documents unix4bi
上のホームディレクトリでの ls
の実行結果に unix4bi ディレクトリが含まれていることを確認してください。unix4bi が含まれていない場合は、データの準備作業のところをもう一度実行してください。
ls
コマンドの後ろにパスを加えると、そのパスに存在しているディレクトリの内容が一覧として表示される。試しに、ルートディレクトリの内容を出力させてみる。ルートディレクトリの出力結果もシステムの種類やユーザーによって異なる。
xxxxxxxxxx
ls /
## bin dev home lib32 libx32 mnt proc run srv tmp var
## boot etc lib lib64 media opt root sbin sys usr
次に、準備作業でダウンロードした unix4bi ディレクトリの中身を出力してみる。pwd
を利用して現在のディレクトリパスを確認し、現在のディレクトリに含まれる unix4bi ディレクトリの中身を出力したい。unix4bi ディレクトリパスを次のようにする。
xxxxxxxxxx
pwd
## /home/donguri
ls /home/donguri/unix4bi
## data projects samples
現在作業しているディレクトリ(/home/donguri)に unix4bi が存在している。つまり、コンピュータにとって、現在の作業ディレクトリから unix4bi ディレクトリが「見える」。コンピュータが目的のディレクトリを直接「見える」とき、次のようにして、絶対パスを書かなくてもよい。
xxxxxxxxxx
ls unix4bi
## data projects samples
このように絶対パスを使う代わりに、現在作業しているディレクトリから見え方で、ディレクトリのパスを記述することもできる。このような方法で記述するパスのことを相対パスと呼ぶ。
cd
(change directory) コマンドはディレクトリの移動に使用するコマンドである。マウスを利用した GUI 操作では、フォルダをダブルクリックして、中身を確認して、対象の子フォルダをさらにダブルクリックして開く、といった操作を繰り返して、目的のフォルダにたどり着くことができる。CLI 操作では、pwd
コマンドで現在の場所を確認して、ls
コマンドで現在のディレクトリの中身を確認して、cd
コマンドを使って子ディレクトリに移動する。cd
コマンドを使って移動する場合は、cd
コマンドの後ろに移動先のパスを書く。パスは、絶対パスでも相対パスでもよい。
xxxxxxxxxx
pwd
## /home/donguri
cd /
pwd
## /
準備作業でダウンロードした unix4bi ディレクトリの構造は、ルートから書き始めると次のようになっている。"???" は、練習問題で使用するため、ここでは中身を明記しない。この unix4bi ディレクトリを使用して cd
、ls
、pwd
の練習を行ってみる。
まず、unix4bi の中に移動して、その中身を ls
で確認してみる。次のスクリプトのうち、1 行目の cd
コマンドには移動先のパスが書かれていない。このとき、システムはホームディレクトリ("/home/donguri")に移動する。パスの書かれていない cd
コマンドを使用することですばやくホームディレクトリに移動できるため、迷ったときあるいはホームディレクトリに戻りたいなどのときに使うと便利である。2 行目以降のスクリプトでは、unix4bi ディレクトリに移動して、パスを確認して、中身を確認していることになる。
xxxxxxxxxx
cd
cd unix4bi
pwd
## /home/donguri/unix4bi
ls
## data projects samples
次に、data ディレクトリに移動して、その中身を ls
で確認してみる。現在の作業ディレクトリから data ディレクトリが見えるため、次のように cd
コマンドを実行すると、data ディレクトリの中に移動することができる。
xxxxxxxxxx
cd data
pwd
## /home/donguri/unix4bi/data
ls
## fastq field_data pdb
続けて、data
ディレクトリから出て、unix4bi ディレクトリの下の projects ディレクトリの下にある athaliana ディレクトリに移動してみる。data ディレクトリから athaliana ディレクトリに移動するには、(上のディレクトリのツリー構造を参考にして、)
の 3 ステップが必要である。1 つ上の層に移動するためには ..
を使用する。
xxxxxxxxxx
pwd
## /home/donguri/unix4bi/data
cd ..
cd projects
cd athaliana
pwd
## /home/donguri/unix4bi/projects/athaliana
ディレクトリの移動を上のように cd
コマンドを 3 回使って行ってきたが、実際は次のようにコマンド 1 回だけで移動することもできる。その際に、区切りとして '/' を使う。
xxxxxxxxxx
pwd
## /home/donguri/unix4bi/data
cd ../projects/athaliana
pwd
## /home/donguri/unix4bi/projects/athaliana
../projects/athaliana のように、現在の作業ディレクトリ(pwd
)から相対的に見て、ディレクトリの場所を記述する方法は相対パスと呼ばれる。cd
コマンドの後ろに絶対パスを使っても、相対パスを使っても同じ結果が得られる。次のスクリプトでは、初めの部分は相対パスを使って athaliana フォルダに移動する例であり、後の部分は絶対パスを使って移動する例である。
xxxxxxxxxx
# relative path
cd
cd unix4bi/projects/athaliana
# absolute path
cd
cd /home/donguri/unix4bi/projects/athaliana
ls
コマンドには様々なオプションが用意されている。オプションを使用するには ls
コマンドのあとに -
をつけてオプションを指定する。例えば -lh
オプションを使用すると、ファイルの所有者、サイズやファイルの更新日などの情報を確認できる。
xxxxxxxxxx
cd /home/donguri/unix4bi/data/field_data
ls
## iris.csv iris.txt yield_data
ls -l
## total 20
## -rw-r--r-- 1 donguri donguri 4150 Dec 5 12:00 iris.csv
## -rw-r--r-- 1 donguri donguri 4150 Dec 5 12:00 iris.txt
## drwxr-xr-x 2 donguri donguri 4096 Dec 6 02:54 yield_data
ls -lh
## total 20K
## -rw-r--r-- 1 donguri donguri 4.1K Dec 5 12:00 iris.csv
## -rw-r--r-- 1 donguri donguri 4.1K Dec 5 12:00 iris.txt
## drwxr-xr-x 2 donguri donguri 4.0K Dec 6 02:54 yield_data
projects ディレクトリ下にある mouse ディレクトリの絶対パスを答えよ。
xxxxxxxxxx
mouse ディレクトリに何件のファイルが含まれているのかを答えよ。また、各ファイルのサイズを答えよ。
xxxxxxxxxx
mouse ディレクトリから、相対パスを使用して、data ディレクトリの下にある field_data ディレクトリに移動するコマンドを書け。
xxxxxxxxxx
cp
(copy) コマンドはファイルのコピーを行うコマンドである。ファイルをコピーするには、コピー元とコピー先を指定する必要がある。cp
コマンドを使用するとき、コピー元、コピー先の順で指定する。コピー元およびコピー先のパスは、絶対パス・相対パスのどちらでもよい。
次のスクリプトは、athaliana ディレクトリに移動して、その中にある genome.gff ファイルコピーして、gene_annotation.gff の名前で保存する例を示している。ファイルをコピーしただけであるので、ファイルのサイズに変化はなく、ファイルの更新日が現在時刻になる。
xxxxxxxxxx
cd
cd unix4bi/projects/athaliana
ls
## README.md genome.fa genome.gff
cp genome.gff gene_annotation.gff
ls -lh
## total 7.6M
## -rw-r--r-- 1 donguri donguri 870 Dec 5 12:00 README.md
## -rw-r--r-- 1 donguri donguri 3.6M Dec 6 02:58 gene_annotation.gff
## -rw-r--r-- 1 donguri donguri 548K Dec 5 12:00 genome.fa
## -rw-r--r-- 1 donguri donguri 3.6M Dec 5 12:00 genome.gff
この例では同じディレクトリの中で、ファイルのコピーを行っている。ディレクトリを跨ぐコピーも同様に行うことができる。次のスクリプトは、athaliana ディレクトリの中にある genome.gff ファイルを data ディレクトリの中にコピーする例を示している。コピー後、ls
コマンドで確認すると、確かに data ディレクトリの中に genome.gff ファイルが存在していることを確認できる。
xxxxxxxxxx
cd
cd unix4bi
ls data
## fastq field_data pdb
cp projects/athaliana/genome.gff data/
ls data
## fastq field_data genome.gff pdb
このように、コピー先のパスをディレクトリ名(例:data/
)で指定することで、同名のファイルのコピーが指定先のディレクトリに保存される。これに対して、コピー先のパスをファイル名まで詳しく記述すると、コピーされたファイルは、指定されたファイル名で保存される。例えば、athaliana ディレクトリにある genome.gff ファイルを、data ディレクトリの下に、gene_annotation.gff の名前でコピーする場合は次のようにする。
xxxxxxxxxx
cd
cd unix4bi
ls data
## fastq field_data genome.gff pdb
cp projects/athaliana/genome.gff data/gene_annotation.gff
ls data
## fastq field_data gene_annotation.gff genome.gff pdb
ディレクトリのコピーを行う場合は -r
オプションを付ける必要がある。-r
は再帰的という意味であり、ディレクトリの中にある子ディレクトリやファイルも同様にコピーすることを意味する。例えば、data ディレクトリをまるごとコピーして、data_backup というディレクトリ名で保存する場合は次のようにする。
xxxxxxxxxx
cd
cd unix4bi
ls
## data projects samples
cp -r data data_backup
ls
## data data_backup projects samples
mv
(move) コマンドは、ファイルおよびディレクトリの移動を行うコマンドである。基本的に cp
コマンドの使い方と同じであり、移動元と移動先を指定する必要がある。cp
はコピーを作るコマンドであるため、コピー先には、コピー元と同一内容のファイルが新たに作られる。これに対して、mv
コマンドは(コピーではなく)ファイルの移動を行うため、移動元からファイルが失くなる。次の例は、pdb ディレクトリの中になる 1alk.fa ファイルを samples ディレクトリの下に移動する例を示している。
xxxxxxxxxx
cd
cd unix4bi
ls samples
## murphys_law.txt
ls data/pdb
## 1alk.cif 1alk.fa 1qo1.cif 1qo1.fa 1wkp.cif 1wkp.fa
mv data/pdb/1alk.fa samples/
ls samples
## 1alk.fa murphys_law.txt
ls data/pdb
## 1alk.cif 1qo1.cif 1qo1.fa 1wkp.cif 1wkp.fa
cp
コマンドのように移動先のパスをファイル名まで詳細に書けば、ファイル名の変更しながら移動ができるようになる。この操作は見かけ上、ファイル名の変更処理にあたる。次の例は samples フォルダの中にある 1alk.fa を 1alk.fasta という名前に変更する例を示している。
xxxxxxxxxx
cd
cd unix4bi/samples
ls
## 1alk.fa murphys_law.txt
mv 1alk.fa 1alk.fasta
ls
## 1alk.fasta murphys_law.txt
mkdir
(make directory) コマンドは空のディレクトリを作成するコマンドである。作成したいディレクトリのパスを与えて実行する。例えば、次の例では、unix4bi ディレクトリの下に textdata という空ディレクトリを作成する場合は次のようにする。
xxxxxxxxxx
cd
cd unix4bi
ls
## data data_backup projects samples
mkdir textdata
ls
## data data_backup projects samples textdata
ファイルを削除する場合は rm
(remove) コマンドを使用する。削除したいファイルのパスを rm
に与えて実行する。例えば、data ディレクトリにある genoem.gff および gene_annotation.gff ファイルを削除する場合は次のように実行する。data ディレクトリの外から相対パスを指定して削除することも、data ディレクトリの中に入ってファイル名(相対パス)を指定して削除することもできる。
xxxxxxxxxx
cd
cd unix4bi
ls data
## fastq field_data gene_annotation.gff genome.gff pdb
rm data/genome.gff
cd data
rm gene_annotation.gff
ls
## fastq field_data pdb
rm
コマンドで削除されたファイルは基本的に復元できない。GUI 操作のようにファイルがゴミ箱に一時保存されるのではなく、rm
コマンドの場合は、ファイルをそのまま削除してしまうことに注意。また、rm
コマンドは、そのままではディレクトリを削除することができない。
ディレクトリを削除するには rmdir
(remove directory) コマンドを利用する。ただし、ディレクトリの内部にファイルや子ディレクトリがある場合は、それらのファイルを予め rm
で削除しておく必要がある。次の例は、samples ディレクトリを samples2 の名前でコピーしてから、samples2 を削除する手順を表している。
xxxxxxxxxx
cd
cd unix4bi
cp -r samples samples2
ls samples2
## 1alk.fasta murphys_law.txt
rm samples2/1alk.fasta
rm samples2/murphys_law.txt
rmdir samples2
このように、削除したいディレクトリの中に入っているファイルをあらかじめ rm
コマンドですべて削除してから、最後に rmdir
コマンドで空となったディレクトリを削除する。始めから rmdir
コマンドを実行するとエラーが起きて、何も起こらない。
ディレクトリの中にファイルが含まれているときに、ファイルとディレクトリを一括で削除たい場合は rm -rf samples
のようなコマンドを使用する。ただし、このコマンドは非常に危険で、パスの指定を間違えると、大事なデータや自作プログラムなどを消去してしまうため、初心者はこのコマンド(rm -rf
)を使わないのようにしてください。
unix4bi ディレクトリに backup ディレクトリを作成し、backup ディレクトリの中に athaliana ディレクトリおよび mouse ディレクトリをコピーせよ。
xxxxxxxxxx
問題 2-1 で作成した backup ディレクトリを削除せよ。
xxxxxxxxxx
samples ディレクトリにある murphys_laws.txt ファイルのコピーを law_of_murphy.txt の名前で作成せよ。また、作成した law_of_murphy.txt を unix4bi ディレクトリの下の data ディレクトリに移動せよ。
xxxxxxxxxx
wc
(word count) コマンドはファイルの行数、単語数および文字数を数えるコマンドである。例えば、samples ディレクトリの中にある murphys_law.txt ファイルに対して行数、単語数、文字数を調べるには次のようにする。
xxxxxxxxxx
cd
cd unix4bi/samples
wc murphys_law.txt
## 21 193 1096 murphys_law.txt
wc
コマンドは 3 つの数値を出力値、順に行数、単語数、文字数を表す。murphys_law.txt ファイルの場合、21 行、193 個の単語、および 1,096 文字からなる。wc
は、単語数の定義が曖昧であるが、行数を数えるのに非常に便利なコマンドである。
ファイルの内容を実際に確認したい場合は、head
、tail
、および cat
(concatenate) コマンドを利用すると便利である。head
および tail
コマンドはファイルの先頭 10 行および後尾 10 行だけを出力するコマンドである。cat
コマンドはファイルの中身をすべて出力するコマンドである。次は、samples ディレクトリにある murphys_law.txt ファイルの中身を出力させる例である。
xxxxxxxxxx
cd
cd unix4bi/samples
head murphys_law.txt
## Smile, tomorrow will be worse.
## Every solution breeds new problems.
## Everything goes wrong all at once.
## Nothing is as easy as it looks.
## Anything that can go wrong will go wrong.
## Matter will be damaged in direct proportion to its value
## If anything simply cannot go wrong, it will anyway.
## Left to themselves, things tend to go from bad to worse.
## If there is a worse time for something to go wrong, it will happen then.
## If everything seems to be going well, you have obviously overlooked something.
tail murphys_law.txt
## You can never tell which way the train went by looking at the track.
## A meeting is an event at which the minutes are kept and the hours are lost.
## Logic is a systematic method of coming to the wrong conclusion with confidence.
## Nothing ever gets built on schedule or within budget.
## The first myth of management is that it exists.
## If an experiment works, something has gone wrong.
## When all else fails, read the instructions.
## Everything takes longer than you think.
## New systems generate new problems.
## Things get worse under pressure.
cat murphys_law.txt
## Smile, tomorrow will be worse.
## Every solution breeds new problems.
## ...
## ...
## New systems generate new problems.
## Things get worse under pressure.
なお、head
および tail
コマンドにオプション -n
を付けることによって、最初の 5 行あるいは最後の 5 行のように行数を指定できる。
xxxxxxxxxx
head -n 2 murphys_law.txt
## Smile, tomorrow will be worse.
## Every solution breeds new problems.
tail -n 3 murphys_law.txt
## Everything takes longer than you think.
## New systems generate new problems.
## Things get worse under pressure.
cat
コマンドにオプション -n
を付けることによって、ファイルの内容は行数と共に表示される。
xxxxxxxxxx
cat -n murphys_law.txt
## 1 Smile, tomorrow will be worse.
## 2 Every solution breeds new problems.
## ...
## ...
## 20 New systems generate new problems.
## 21 Things get worse under pressure.
less
コマンドは cat
コマンドと同じくファイルの内容を表示するコマンドである。cat
コマンドは、ファイルの内容を一括に出力するが、less
コマンドは、ファイルの内容を少しずつ(less)出力する。次は、athaliana ディレクトリの下の genome.gff ファイルの中身を確認する例である。
xxxxxxxxxx
cd
cd unix4bi/projects/athaliana
less genome.gff
less
を実行すると、ファイルの内容が画面上に表示される。このとき、キーボードを使って、ページめくりや検索などを行うことができる。よく使うキー制御に次のようなものがある。
キー | 動作 |
---|---|
Enter/Return | 次の行に移動 |
y | 前の行に移動 |
SPACE | 次のページに移動 |
b | 前のページに移動 |
g | ファイルの先頭に移動 |
G | ファイルの後尾に移動 |
/apple | 今の位置より後ろの内容に対して文字列 "apple" を検索 |
?apple | 今の位置よりも前の内容に対して文字列 "apple" を検索 |
n | 次の検索ヒット箇所に移動 |
N | 前の検索ヒット箇所に移動 |
q | 終了 |
less
コマンドを終了させたい場合は、キーボードで q
キーを入力する。多くのコマンドやプログラムでは q
は終了を意味するので、コマンドやプログラムから出られなかったら q
キーを入力してみてください。
grep
(globally search for a regular expression and print matching lines) コマンドはテキストファイルに対して検索を行うコマンドである。例えば、athaliana ディレクトリにある genome.gff ファイルの中に、遺伝子 AT1G65480 の情報だけを検索したい場合は次のようにする。
xxxxxxxxxx
cd
cd unix4bi/projects/athaliana
grep "AT1G65480" genome.gff
## Chr1 TAIR10 gene 24331428 24333934 . + . ID=AT1G65480;Note=protein_coding_gene;Name=AT1G65480
オプション -n
を付けると検索でヒットした行の行番号が出力される。
xxxxxxxxxx
grep -n "AT1G65480" genome.gff
## 7371:Chr1 TAIR10 gene 24331428 24333934 . + .ID=AT1G65480;Note=protein_coding_gene;Name=AT1G65480
オプション -v を付けると、検索でヒットしなかったが出力される。次は、AT1G65480 を含まない行を出力している例を示している。
xxxxxxxxxx
grep -v "AT1G65480" genome.gff
grep
コマンドの機能は多様である。例えば、複数のファイルに対して一括に検索して、検索キーワードを含むファイル名を出力したり、あるいは含まないファイル名を出力したりする機能もある。grep
コマンドに少し慣れたところで、これらの機能を探して使ってみてください。
>
(redirection) は画面上に出力される情報をファイルに出力させたいときに使用するものである。cat
、wc
、grep
などのコマンドを実行すると、その実行結果が画面上に表示される。これらの実行結果をファイルに保存させるときに >
を使用する。次サンプルコードは、athaliana ディレクトリにある genome.gff の内容のうち、mRNA_TE_gene を含む行のデータだけを抽出して、TE_gene.gff に保存する例を示している。
xxxxxxxxxx
cd
cd unix4bi/projects/athaliana
ls
## README.md gene_annotation.gff genome.fa genome.gff
grep "mRNA_TE_gene" genome.gff > TE_gene.gff
ls
## README.md TE_gene.gff gene_annotation.gff genome.fa genome.gff
wc TE_gene.gff
## 3911 35199 411166 TE_gene.gff
違う例を実行してみる。athaliana ディレクトリにある genome.gff の内容のうち、mRNA_TE_gene を含む行のデータだけを除いて、それ以外の全データを new_genome.gff に保存してみる。
xxxxxxxxxx
grep -v "mRNA_TE_gene" genome.gff > new_genome.gff
wc new_genome.gff
## 33602 302418 3280276 new_genome.gff
|
(パイプ)は複数のコマンドを繋げて実行したいときに使用する。例えば、grep
コマンドでテキスト検索を行い、その検索結果を(ファイルに保存しないで)そのまま wc
コマンドに渡して、行数や文字数を数えたい場合に使用する。ここで、athaliana ディレクトリにある genome.gff の内容のうち、mRNA_TE_gene を含む行だけを grep
コマンドで抽出して、これらのデータに含まれる文字数などの情報を wc
コマンドで調べてみる。
xxxxxxxxxx
cd
cd unix4bi/projects/athaliana
grep "mRNA_TE_gene" genome.gff | wc
## 3911 35199 411166
上の例では、2 つのコマンドを |
で繋げて実行している。実際には複数のコマンドを繋げて実行することもできる。例えば、キーワード Chr1 かつ tRNA を含む行を抽出するには次のように、grep
を |
で繋げて書く。このとき、2 番目の grep
への入力は |
の左側から流れてくるため、grep
にはファイルのパスを指定する必要はない。
xxxxxxxxxx
grep "Chr1" genome.gff | grep "tRNA"
## Chr1 TAIR10 gene 111890 111961 . - . ID=AT1G01270;Note=tRNA;Name=AT1G01270
## Chr1 TAIR10 gene 306384 306456 . + . ID=AT1G01870;Note=tRNA;Name=AT1G01870
## Chr1 TAIR10 gene 309275 309347 . - . ID=AT1G01890;Note=tRNA;Name=AT1G01890
## ...
## ...
## ...
画面上に多くの情報が出力される。情報が多くて確認しにくいため、ここでは、上のコマンドの出力結果に対して、さらに wc
コマンドを実行させて、行数や文字数を調べてみる、
xxxxxxxxxx
grep "Chr1" genome.gff | grep "tRNA" | wc
## 240 2160 18826
このように、|
を有効に使うことで、中間ファイルを作らずに解析を進めることができるので、非常に効率がよい。
また、head
コマンドと tail
コマンドを |
で繋ぐことで、例えば、ファイルの 5 行目から 10 行目までの内容を表示する、といった作業ができるようになる。
xxxxxxxxxx
grep "Chr1" genome.gff | grep "tRNA" | head -n 10 | tail -n 5
## Chr1 TAIR10 gene 604402 604474 . + . ID=AT1G02760;Note=tRNA;Name=AT1G02760
## Chr1 TAIR10 gene 877648 877719 . + . ID=AT1G03515;Note=tRNA;Name=AT1G03515
## Chr1 TAIR10 gene 892514 892585 . + . ID=AT1G03570;Note=tRNA;Name=AT1G03570
## Chr1 TAIR10 gene 909811 909883 . - . ID=AT1G03640;Note=tRNA;Name=AT1G03640
## Chr1 TAIR10 gene 1159023 1159093 . + . ID=AT1G04320;Note=tRNA;Name=AT1G04320
samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルの行数、および単語 "is" を含む行の行数を答えよ。
xxxxxxxxxx
samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルの 8 〜 15 行目のうち、単語 "is" を含む行は何行あるかを答えよ。
xxxxxxxxxx
samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルのうち、単語 "will" かつ "go" の両方を含む行の行数を答えよ。
xxxxxxxxxx
samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルのうち、単語 "will" かつ "go" の両方を含む行の内容を text2.txt ファイルに保存せよ。
xxxxxxxxxx
samples ディレクトリ中の murphys_law.txt には英語のテキストデータが保存されている。このファイルのうち、単語 "will" を含む、かつ "go" を含まない行の行数を答えよ。
xxxxxxxxxx
echo
コマンドは何らかの文字列を画面上に出力するコマンドである。他のプログラミング言語の print
関数の働きに似ている。
xxxxxxxxxx
echo "hello world"
## hello world
echo
コマンドは文字列を画面上に出力するが、リダイレクトを使用するとで、ファイルに保存することもできる。
xxxxxxxxxx
cd
cd unix4bi
echo "hello world" > hello_world.txt
cat hello_world.txt
## hello world
echo "(^_^) /~~" > hello_world.txt
cat hello_world.txt
## (^_^) /~~
上のコードを見ると、2 回目の echo
>
を実行した後に、hello_world.txt ファイルには "(^_^) /~~" しか含まれていないことが確認取れる。これは、2 回目の >
を使ったときに、同名のファイルがすでに存在する場合は、それを廃棄して、ファイルを新規作成されてしまうためである。echo
コマンドを複数回実行して、複数の文字列を同じファイルに書き込む際に、2 回目以降は、追加書き込み用の >>
を使用する必要がある。
xxxxxxxxxx
cd
cd unix4bi
echo "hello world" > hello_world.txt
echo "(^_^) /~~" >> hello_world.txt
cat hello_world.txt
## hello world
## (^_^) /~~
cut
コマンドは、整理されたタブ区切りのファイルから特定の列(フィールド)を切り出して表示するコマンドである。TSV や CSV ファイルの特定の列を繰り出す際によく利用する。
athaliana ディレクトリの中にある genome ファイルはタブ区切りのデータとなっている。実際に、このデータの中から、3 列目を切り出して表示させてみる。ただし、スペースの紙面の関係で、ここでは head
コマンドで最初の 5 行のみを表示する。
xxxxxxxxxx
cd
cd unix4bi/projects/athaliana
cut -f 1 genome.gff | head -n 5
## Chr1
## Chr1
## Chr1
## Chr1
## Chr1
複数の列を切り出すこともできる。
xxxxxxxxxx
cut -f 1,3,4,5 genome.gff | head -n 5
## Chr1 gene 3631 5899
## Chr1 gene 5928 8737
## Chr1 gene 11649 13714
## Chr1 gene 23146 31227
## Chr1 gene 28500 28706
CSV ファイルの場合は区切り文字が , となっている。CSV ファイルに対して cut
コマンドを適用したい場合は、-d
オプションをつけて、区切り文字を , に設定する必要がある。
xxxxxxxxxx
cd
cd unix4bi/data/field_data
cut -f 2 -d"," iris.csv | head -n 5
## 5.1
## 4.9
## 4.7
## 4.6
## 5
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
)を数値として並べ替えを行う例を示している。
xxxxxxxxxx
cd
cd unix4bi/data/field_data
head -n 5 iris.txt
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5 3.6 1.4 0.2 setosa
sort -k 2 -n iris.txt | head -n 5
## 14 4.3 3 1.1 0.1 setosa
## 39 4.4 3 1.3 0.2 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 42 4.5 2.3 1.3 0.3 setosa
オプション -r
を付けることによって、逆順にすることができる。
xxxxxxxxxx
sort -k 2 -n -r iris.txt | head -n 5
## 132 7.9 3.8 6.4 2 virginica
## 136 7.7 3 6.1 2.3 virginica
## 123 7.7 2.8 6.7 2 virginica
## 119 7.7 2.6 6.9 2.3 virginica
## 118 7.7 3.8 6.7 2.2 virginica
sort
コマンドには多くのオプションが用意されている。ファイルの内容を文字列としてソートしたり、数値としてソートしたりすることができる。必要なときに調べるとよい。
uniq
(unique) コマンドは重複データを処理するためのコマンドである。その機能をみるために、ここで data ディレクトリ中の iris.txt ファイルの 6 行目のデータを切り出して、uniq
コマンドを実行してみる。
xxxxxxxxxx
cd
cd unix4bi/data/field_data
wc iris.txt
## 150 900 4150 iris.txt
cut -f 6 iris.txt | head -n 5
## setosa
## setosa
## setosa
## setosa
## setosa
cut -f 6 iris.txt | uniq
## setosa
## versicolor
## virginica
Iris.txt は 150 行からなるデータだが、その 6 列目には setosa、versicolor、virginica の 3 種類の値しかないことがわかる。次に uniq
コマンドにオプションを付けて、それぞれの値が何件分(何行)存在するかを調べてみる。
xxxxxxxxxx
cut -f 6 iris.txt | uniq -c
## 50 setosa
## 50 versicolor
## 50 virginica
それぞれ 50 件存在することがわかった。このように、UNIX コマンドを組み合わせ使うことで、マウス操作などを行わずにデータの中身を確認したり、データを変更したりすることができる。
athaliana ディレクトリの中にある genome.gff ファイルはタブ区切りのファイルである。このファイルの中身のうち、"Note=tRNA" を含む行を抽出し、第 4 列目の値に応じて、降順に並べ替えよ。
xxxxxxxxxx
athaliana ディレクトリの中にある genome.gff ファイルはタブ区切りのファイルである。このファイルの 3 列目にはどのような値が存在するのかを調べよ。また、それぞれの値が何件ずつ存在するのかを答えよ。(ヒント:uniq | sort
または sort | uniq
を使う。両者の結果は異なるので、正しい方を使ってください。可能であれば、両者が異なる結果を出力する理由を述べよ。)
xxxxxxxxxx
field_data ディレクトリの中にある iris.csv ファイルはカンマ区切りのファイルである。このファイルの 4 列目の値の中で、最大値を持つ行のみを出力せよ。
xxxxxxxxxx
field_data ディレクトリの中にある iris.csv ファイルはカンマ区切りのファイルである。6 列目が versicolor となっている行のうち、5 列目の値が最小値となっている行のみを出力せよ。
xxxxxxxxxx
field_data ディレクトリの中にある iris.csv ファイルはカンマ区切りのファイルである。setosa、versicolor、virginica の 3 種それぞれについて、2 列目の値が最大値となっている行、iris_max_sepal_length.csv という 1 つのファイルに保存せよ。
xxxxxxxxxx