2.5. コマンド#
コマンド(command)とは、CUI 環境でコンピュータに指示を与えるための命令のことです。ファイルのコピーや検索、削除など、コンピュータに具体的な動作を行わせる 1 つ 1 つの命令を指します。UNIX 系の OS で利用できるコマンドは数多く存在します。本節では、サンプルデータを使いながら、基本的なコマンドの使い方を紹介します。使い方はこれから練習していけば十分ですが、はじめのうちは、これらのコマンドを語学でいう「単語」のように考え、ある程度暗記しておくと理解が進みます。
本節を進める前に、まずサンプルデータ takarabako.zip をダウンロードして、デスクトップに展開してください。なお、ダウンロードから展開までの作業をコマンドで実行したい場合は、次のコマンドをターミナルで実行してください。
cd ~/Desktop
wget https://bi.biopapyrus.jp/data/takarabako.zip
unzip takarabako.zip
2.5.1. 基本用語#
コマンドを理解するうえで、いくつかの基本用語を理解しておく必要があります。以下に主要な用語を説明します。
用語 |
説明 |
|---|---|
ディレクトリ(directory) |
ファイルや他のディレクトリを格納するためのコンテナです。一般にフォルダとも呼ばれます。 |
ルートディレクトリ(root directory) |
ファイルシステムの最上位に位置するディレクトリで、 |
ホームディレクトリ(home directory) |
各ユーザーの個人用ディレクトリで、 |
カレントディレクトリ(current directory) |
現在作業しているディレクトリで、 |
親ディレクトリ(parent directory) |
現在のディレクトリの一つ上の階層にあるディレクトリで、 |
パス(path) |
ファイルやディレクトリの場所を示す文字列で、いわば住所のようなものです。パスには絶対パスと相対パスがあります。 |
絶対パス(absolute path) |
ルートディレクトリから始まるパスです。例えば、 |
相対パス(relative path) |
現在のディレクトリからの相対的な位置を示すパスです。例えば、 |
2.5.2. 基本コマンド#
2.5.2.1. echo#
echo コマンドは、指定した文字列を画面に表示するだけのシンプルなコマンドです。ターミナルを起動して、次のコマンドを実行してみてください。
echo "hello, world"
hello, world
画面上には hello, world と表示されます。それだけです。安心してください。この時点では、まだ何も壊していません。
2.5.2.2. pwd#
pwd (print working directory) コマンドは、カレントディレクトリの絶対パスを表示するコマンドです。CUI 操作では、GUI のようにフォルダ構造を視覚的に確認できないため、自分が今どのディレクトリで作業しているのかを常に意識する必要があります。しかし、ディレクトリ間を移動したり、さまざまな操作を行っているうちに、現在位置が分からなくなることもあります。そのようなときに pwd コマンドを使うと、カレントディレクトリのパスを確認できます。
ターミナルを起動して、pwd コマンドを実行してみてください。Ubuntu を使っている場合、次のように表示されます。
pwd
/home/rispy
ターミナルを起動した直後は、カレントディレクトリがホームディレクトリになっているため、一般的にこのような表示になります。Windows (WSL) を使用している場合も同様です。rispy の部分はユーザー名で、ユーザーによって異なります。
macOS の場合は、ディレクトリ構造が異なるため、次のように表示されます。
pwd
/Users/rispy
2.5.2.3. ls#
ls (list) コマンドは、ディレクトリの内容を一覧表示するコマンドです。CUI 操作 では、フォルダの中身が視覚的に見えないため、どのようなファイルや子ディレクトリが存在するのか把握しにくくなります。ls コマンドを使うことで、現在のディレクトリに含まれるファイルやディレクトリの一覧を確認できます。
次の例では、pwd コマンドで現在の作業ディレクトリを表示し、ls コマンドでその中身を表示しています。出力結果は、システムやユーザーによって異なります。
pwd
/home/rispy
ls
Desktop Downloads Documents
ls コマンドの後ろにパスを指定すると、そのディレクトリの中身を表示できます。例えば、デスクトップ (Desktop) の内容を表示すると、次のようになります。
ls Desktop
タカの捕食に関する研究.pdf
ヘビの生態調査.xlsx
天敵対策バイブル.pdf
どんぐりの森プロジェクト
どんぐりの美味しさ研究
コマンドにはさまざまなオプションが用意されています。オプションは、コマンドの後ろに - を付けて指定します。ls には -a、-l、-h などがあり、-a は隠しファイルも含めてすべて表示し、-l は詳細情報を表示し、-h はファイルサイズを人間に読みやすい形式で表示します。複数指定する場合は、- の後に続けて記述します。例えば、次のような組み合わせがよく使われます。
ls -alh Desktop
total 44K
drwxr-xr-x 7 rispy squirrel 4.0K Jan 13 10:15 .
drwx------ 15 rispy squirrel 4.0K Jan 13 09:50 ..
-rw-r--r-- 1 rispy squirrel 24K Jan 12 22:10 タカの捕食に関する研究.pdf
-rw-r--r-- 1 rispy squirrel 18K Jan 12 22:05 ヘビの生態調査.xlsx
-rw-r--r-- 1 rispy squirrel 16K Jan 12 21:55 天敵対策バイブル.pdf
drwxr-xr-x 5 rispy squirrel 4.0K Jan 12 21:40 どんぐりの森プロジェクト
drwxr-xr-x 4 rispy squirrel 4.0K Jan 12 21:30 どんぐりの美味しさ研究
2.5.2.4. cd#
cd (change directory) コマンドは、ディレクトリを移動するためのコマンドです。GUI ではフォルダをダブルクリックして目的の場所まで移動しますが、CUI では pwd で現在位置を確認し、ls で中身を見ながら cd で移動します。cd の後ろに移動先のパスを指定します。
pwd
/home/respy
cd Desktop
pwd
/home/respy/Desktop
cd の後に何も指定しない場合は、ホームディレクトリへ移動します。
cd
pwd
/home/respy
また、ホームディレクトリを表す記号 ~ を利用しても、同じ結果になります。
cd ~
pwd
/home/respy
Linux や macOS では、基本的に個人で利用できる領域はホームディレクトリ以下に限られています。したがって、ホームディレクトリ以下にあるさまざまなディレクトリに移動する際には、~ を活用すると便利です。例えば、カレントディレクトリがどこにあっても、次のようにするとホームディレクトリ直下の Desktop に移動できます。
cd ~/Desktop
2.5.3. ディレクトリ操作#
2.5.3.1. mkdir#
ディレクトリの作成は mkdir(make directory)コマンド、削除は rmdir(remove directory)コマンドで行います。例えば、デスクトップ上に acorns_data という名前のディレクトリを作成する場合は、次のように cd コマンドでデスクトップに移動してから mkdir コマンドを実行します。
cd ~/Desktop
mkdir acorns_data
続けて、acorns_data ディレクトリの下に、さらに konara という名前のディレクトリを作成する場合は、次のようにします。
mkdir acorns_data/konara
2.5.3.2. rmdir#
ディレクトリの削除は rmdir(remove directory)コマンドを使用します。例えば、先ほど作成した acorns_data ディレクトリを削除する場合は、次のように実行します。
rmdir acorns_data
rmdir: acorns_data: Directory not empty
実際に実行してみると、このようにエラーが表示されます。実は、rmdir コマンドは中身が空のディレクトリしか削除できません。そのため、acorns_data ディレクトリを削除するには、まず konara ディレクトリを削除してから、acorns_data ディレクトリを削除する必要があります。
rmdir acorns_data/konara
rmdir acorns_data
中身の有無に関わらずディレクトリを削除したい場合は、次の小節で紹介する rm コマンドを使用します。
2.5.4. ファイル操作#
ファイルの内容確認やコピー、名前変更なども、すべてコマンドで行えます。これらをシェルと組み合わせることで、拡張子の一括変更や特定条件のファイル抽出など、高度な操作も可能になります。また、コンピュータの世界では、ディレクトリも基本的にはファイルと同じように扱われます。中にファイルや別のディレクトリを含めることができる点を除けば、操作方法はほぼ共通です。そのため、ここで紹介するコマンドの多くは、ディレクトリに対しても同様に使用できます。
なお、これらのコマンドには「やり直し」という概念がありません。特に「まあ大丈夫でしょ」と思った瞬間から、あとは後悔だけが残ります。
2.5.4.1. cp#
cp(copy)コマンドは、ファイルやディレクトリをコピーします。コピー元、コピー先の順に指定します。コピー先に同名のファイルがすでに存在する場合、確認することなく上書きされます。
大事なことなので、もう一度言います。コピー先にある既存のファイルは上書きされます。そして、この操作はやり直しできません。
それでは例を見ていきます。次のコマンドを実行すると、data ディレクトリの中にある acorns.csv ファイルが、カレントディレクトリ(現在の作業ディレクトリ)に acorns.csv という名前でコピーされます。ここでは cd でデスクトップに移動してから作業を行っているため、カレントディレクトリはデスクトップです。そのため、ファイルはデスクトップ上にコピーされます。
cd ~/Desktop
cp takarabako/acorns_data/acorns.csv acorns.csv
カレントディレクトリに同じ名前でコピーする場合、コピー先のファイル名を省略することもできます。例えば、次のようにコピー先をカレントディレクトリの略記である . と指定すると、同じ結果が得られます。
cp takarabako/acorns_data/acorns.csv .
また、カレントディレクトリに acorns_backup.csv という名前でコピーしたい場合は、次のようにコピー先のファイル名を指定します。
cp takarabako/acorns_data/acorns.csv acorns_backup.csv
ディレクトリをコピーする場合は -r オプションを付けます。これは、ディレクトリの中にあるサブディレクトリやファイルも再帰的(recursive)にコピーすることを意味します。次のコマンドは、takarabako ディレクトリ全体を takarabako_backup という名前でコピーしています。
cp -r takarabako takarabako_backup
ls コマンドで takarabako_backup ディレクトリの中身を確認すると、その中に takarabako ディレクトリがコピーされていることが分かります。
ls takarabako_backup
acorns_data data projects seq text
なお、コピー先がすでに存在するディレクトリであれば、その中にコピーされます。例えば、上と同じコマンドをもう一度実行すると、takarabako_backup ディレクトリがすでに存在しているため、その中に takarabako ディレクトリがコピーされます。
cp -r takarabako takarabako_backup
ls takarabako_backup
acorns_data data projects seq takarabako text
takarabako_backup ディレクトリの中に takarabako ディレクトリが存在していることが分かります。そして、その中身も同様にコピーされています。
ls takarabako_backup/takarabako
acorns_data data projects seq text
2.5.4.2. mv#
mv(move)コマンドは、ファイルやディレクトリを移動するコマンドです。使い方は cp コマンドとほぼ同じで、移動元、移動先の順に指定します。移動先がすでに存在している場合は、確認することなく上書きされます。一方、移動先が存在しない場合は、移動元の名前が変更されることになります。
次の例では、cp コマンドの練習で作成した takarabako_backup ディレクトリの名前を takarabako_v1 に変更しています。
mv takarabako_backup takarabako_v1
次の例では、デスクトップに takarabako_backup ディレクトリを新たに作成し、その中に takarabako_v1 ディレクトリを移動しています。
mkdir -p takarabako_backup
mv takarabako_v1 takarabako_backup/
ここまでの例をすべて実行した後、takarabako_backup ディレクトリはカオスな状態になっているはずです。それを削除して一度リセットしたいところです。そこで登場するのが rm コマンドです。
2.5.4.3. rm#
rm(remove)コマンドは、ファイルやディレクトリを削除するコマンドです。名前は可愛いですが、中身は殺し屋です。
ここでサンプルデータ中の、athaliana プロジェクトの README.md ファイルを削除してみます。
cd ~/Desktop/takarabako/projects/athaliana
rm README.md
次に、デスクトップ上に作成した takarabako_backup ディレクトリを削除してみます。
cd ~/Desktop
rm takarabako_backup
rm: takarabako_backup: is a directory
このように、rm コマンドでディレクトリを削除しようとするとエラーになります。
これが最後の良心です。
本来であれば、まず rm コマンドでディレクトリ内のファイルをすべて削除し、その後 rmdir コマンドで空になったディレクトリを削除する方が安全です。しかし、ディレクトリの構造が複雑になると、この作業は非常に手間がかかります。
そこで、rm コマンドに再帰的に削除する -r オプションを付けることで、ディレクトリごと一括で削除できます。次のコマンドは、takarabako_backup ディレクトリと、その中に含まれるすべてのファイルおよびサブディレクトリを削除します。
rm -r takarabako_backup
rm -r コマンドは強力で便利ですが、削除したファイルやディレクトリは基本的に復元できません。このコマンドにはゴミ箱という概念は存在しません。特にワイルドカード(* や ?)を使う場合やパス指定を誤った場合、想定外のファイルを削除してしまう危険があります。
「ひと段落ついてからバックアップしよう」と思い続けたまま、結局バックアップせず、気づけば締切前日の深夜。すべてがようやくまとまった、その瞬間、「不要な一時ファイルだけ消そう」と思い立ち、「まあ大丈夫でしょ」と根拠のない自信で Enter を押す。
こうした小さな瞬間が重なったとき、人生は終わります。
2.5.5. ファイル内容の閲覧#
2.5.5.1. wc#
wc(word count)は行数、単語数、文字数を数えるコマンドです。出力は行数、単語数、文字数の順です。
cd ~/Desktop/takarabako/text
wc murphys_law.txt
21 193 1096 murphys_law.txt
特定の情報だけを知りたい場合は、オプションを付けます。-l は行数、-w は単語数、-c は文字数です。
wc -l murphys_law.txt
21 murphys_law.txt
2.5.5.2. cat#
cat (concatenate) はファイルの内容全体出力するコマンドです。例えば、murphys_law.txt ファイルの内容を表示するには、次のようにします。
cat murphys_law.txt
Smile, tomorrow will be worse.
Every solution breeds new problems.
...
...
New systems generate new problems.
Things get worse under pressure.
cat コマンドにオプション -n を付けることで、行番号付きで表示できます。
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.
2.5.5.3. head / tail#
head と tail はファイルの内容のうち、先頭や末尾のみを表示します。
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.
オプション -n を用いることで行数指定も可能です。
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.
2.5.5.4. less#
less コマンドはファイルの内容を画面上で閲覧するためのコマンドです。cat と異なり、一度にすべての内容を表示せず、ページ単位でスクロールしながら閲覧できます。大量のテキストファイルを扱う際に便利です。
次は、サンプルデータの athaliana プロジェクトの下の genome.gff ファイルの中身を確認する例です。
cd ~/Desktop/takarabako/projects/athaliana
less genome.gff
less を実行すると、ファイルの内容が画面上に表示される。このとき、キーボードを使って、ページめくりや検索などを行うことができる。よく使う制御キーに次のようなものがあります。ファイル内容の表示を終了するには q キーを入力します。
キー |
動作 |
|---|---|
Enter/Return |
次の行に移動 |
y |
前の行に移動 |
Space |
次のページに移動 |
b |
前のページに移動 |
g |
ファイルの先頭に移動 |
G |
ファイルの後尾に移動 |
/文字列 |
文字列を検索 |
?文字列 |
文字列を逆方向に検索 |
n |
次の検索結果に移動 |
N |
前の検索結果に移動 |
q |
less を終了 |
2.5.5.5. grep#
grep (globally search for a regular expression and print matching lines) はテキスト検索コマンドです。例えば、サンプルデータの athaliana プロジェクトの下の genome.gff ファイルの中にある遺伝子 AT1G65480 の情報だけを検索して表示する場合は、次のようにします。
cd ~/Desktop/takarabako/projects/athaliana
grep "AT1G65480" genome.gff
Chr1 TAIR10 gene 24331428 24333934 . + . ID=AT1G65480;Note=protein_coding_gene;Name=AT1G65480
検索でヒットした行の行番号を表示させる場合は -n オプションをつけて利用します。
grep -n "AT1G65480" genome.gff
7371:Chr1 TAIR10 gene 24331428 24333934 . + . ID=AT1G65480;Note=protein_coding_gene;Name=AT1G65480
また、否定検索を行う場合は -v を利用します。例えば、ミトコンドリアゲノム以外の情報を抽出したい場合は次のようにします。
grep -v "ChrM" genome.gff
Chr1 TAIR10 gene 3631 5899 . + . ID=AT1G01010;Note=protein_coding_gene;Name=AT1G01010
Chr1 TAIR10 gene 5928 8737 . - . ID=AT1G01020;Note=protein_coding_gene;Name=AT1G01020
Chr1 TAIR10 gene 11649 13714 . - . ID=AT1G01030;Note=protein_coding_gene;Name=AT1G01030
Chr1 TAIR10 gene 23146 31227 . + . ID=AT1G01040;Note=protein_coding_gene;Name=AT1G01040
Chr1 TAIR10 gene 28500 28706 . + . ID=AT1G01046;Note=miRNA;Name=AT1G01046
...
...
ChrC TAIR10 gene 144921 145154 . - . ID=ATCG01270;Note=protein_coding_gene;Name=ATCG01270
ChrC TAIR10 gene 145291 152175 . - . ID=ATCG01280;Note=protein_coding_gene;Name=ATCG01280
ChrC TAIR10 gene 152264 152337 . + . ID=ATCG01290;Note=tRNA;Name=ATCG01290
ChrC TAIR10 gene 152506 152787 . + . ID=ATCG01300;Note=protein_coding_gene;Name=ATCG01300
ChrC TAIR10 gene 152806 154312 . + . ID=ATCG01310;Note=protein_coding_gene;Name=ATCG01310
2.5.6. シェル演算子#
2.5.6.1. > (リダイレクト)#
>(リダイレクト)は、本来画面に表示される出力結果をファイルに保存したいときに使用するシェル演算子です。通常、コマンドの実行結果は「標準出力」として画面に表示されますが、> を使うことで、その出力をファイルへ書き込むことができます。
例えば、grep コマンドで特定のキーワードを含む行だけを抽出し、その結果をファイルとして保存したい場合に利用します。ここでは、athaliana プロジェクトに含まれる genome.gff から miRNA に関する行のみを抽出して miRNA.gff に保存してみます。
cd ~/Desktop/takarabako/projects/athaliana
ls
genome.fa genome.gff README.md
次のコマンドでは、genome.gff の中から miRNA を含む行を検索し、その結果を miRNA.gff に保存しています。
grep "miRNA" genome.gff > miRNA.gff
ls
genome.fa genome.gff miRNA.gff README.md
head miRNA.gff
Chr1 TAIR10 gene 28500 28706 . + . ID=AT1G01046;Note=miRNA;Name=AT1G01046
Chr1 TAIR10 gene 78932 79032 . - . ID=AT1G01183;Note=miRNA;Name=AT1G01183
Chr1 TAIR10 gene 2165517 2165746 . + . ID=AT1G07051;Note=miRNA;Name=AT1G07051
Chr1 TAIR10 gene 3961348 3961464 . - . ID=AT1G11735;Note=miRNA;Name=AT1G11735
Chr1 TAIR10 gene 4182132 4182299 . - . ID=AT1G12294;Note=miRNA;Name=AT1G12294
Chr1 TAIR10 gene 4820405 4820499 . - . ID=AT1G14071;Note=miRNA;Name=AT1G14071
Chr1 TAIR10 gene 6220648 6220833 . + . ID=AT1G18075;Note=miRNA;Name=AT1G18075
Chr1 TAIR10 gene 6520941 6521124 . + . ID=AT1G18879;Note=miRNA;Name=AT1G18879
Chr1 TAIR10 gene 6695420 6695609 . - . ID=AT1G19371;Note=miRNA;Name=AT1G19371
Chr1 TAIR10 gene 6740500 6740591 . + . ID=AT1G19464;Note=miRNA;Name=AT1G19464
wc miRNA.gff
177 1593 13988 miRNA.gff
このように、> を使うことでコマンドの結果をそのままファイルとして保存できます。
2.5.6.2. | (パイプ)#
|(パイプ)は、あるコマンドの出力を、次のコマンドの入力として渡すためのシェル演算子です。これにより、中間ファイルを作らずに処理を連結できます。
先ほどと同様に genome.gff から miRNA を含む行を検索し、その行数を調べてみます。この例では、grep で検索した結果を wc コマンドに渡して行数、単語数、文字数を数えています。
cd ~/Desktop/takarabako/projects/athaliana
grep "miRNA" genome.gff | wc
177 1593 13988
パイプは何個でもつなげることができます。例えば、ミトコンドリア(ChrM)と葉緑体(ChrC)の情報を除外してから行数を数えるには次のようにします。
grep -v "ChrM" genome.gff | grep -v "ChrC" | wc
37234 335106 3667651
また、抽出した内容を表示させて確認したい場合は less コマンドを組みあせて使用します。
grep -v "ChrM" genome.gff | grep -v "ChrC" | less
最後にリダイレクトを利用することで、パイプで繋いだコマンドの最終結果をファイルに保存することもできます。
grep -v "ChrM" genome.gff | grep -v "ChrC" > nchr.gff
また、head コマンドと tail コマンドを | で繋ぐことで、例えば、ファイルの 5 行目から 10 行目までの内容を表示する、といった作業ができるようになります。
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
2.5.7. ファイル内容の編集#
2.5.7.1. cut#
cut コマンドは、整理されたタブ区切りのファイルから特定の列(フィールド)を切り出して表示するコマンドです。TSV や CSV ファイルの特定の列を切り出す際によく利用されます。
athaliana ディレクトリの中にある genome ファイルはタブ区切りのデータとなっています。実際に、このデータの中から 3 列目を切り出して表示させてみます。ただし、紙面の都合上、ここでは head コマンドで最初の 5 行のみを表示します。
cd ~/Desktop/takarabako/projects/athaliana
cut -f 1 genome.gff | head -n 5
Chr1
Chr1
Chr1
Chr1
Chr1
複数の列を切り出すこともできます。例えば、1 列目、3 列目、4 列目、5 列目を同時に切り出すには次のようにします。
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 オプションを付けて区切り文字を , に設定する必要があります。
cd ~/Desktop/takarabako/acorns_data
cut -f 2 -d "," acorns.csv | head -n 5
weight
5.55
6.77
4.62
7.41
2.5.7.2. sort#
sort コマンドは、整理されたタブ区切りのファイルについて、特定の列の値に従って行を並べ替えるコマンドです。sort コマンドはデフォルトでは文字列として並べ替えますが、オプション -n を付けることで数値として並べ替えることもできます。例えば、10, 1, 5, 100, 50 を文字列として並べると 1, 10, 100, 5, 50 となりますが、数値として並べ替えると 1, 5, 10, 50, 100 となります。数値として並べ替えたいときは、オプション -n を付け忘れないようにしてください。
次に、acorns_data ディレクトリにある CSV ファイル acorns.csv の 2 列目(-k 2)を数値として並べ替える例を示します。
cd ~/Desktop/takarabako/acorns_data
head -n 5 acorns.csv
tree,weight,height,diameter,location
kunugi,5.55,2.27,1.89,TKM
kunugi,6.77,2.34,2.00,TKM
kunugi,4.62,1.98,1.84,TKM
kunugi,7.41,2.35,2.12,TKM
sort -k 2 -n acorns.csv | head -n 5
arakashi,0.92,1.65,1.00,NKM
arakashi,0.97,1.56,1.05,NKM
arakashi,1.02,1.45,1.12,PLZ
arakashi,1.02,1.58,1.05,NKM
arakashi,1.03,1.60,1.05,NKM
オプション -r を付けることで逆順に並べ替えることができます。
sort -k 2 -n -r acorns.csv | head -n 5
tree,weight,height,diameter,location
shirakashi,2.12,1.97,1.32,SPN
shirakashi,2.01,1.94,1.39,SPN
shirakashi,1.96,2.06,1.23,SPN
shirakashi,1.90,2.06,1.25,SPN
sort コマンドには多くのオプションが用意されており、文字列としてのソートや数値としてのソートなど、用途に応じた使い分けが可能です。必要に応じてマニュアルなどを参照してください。
2.5.7.3. uniq#
uniq ( unique ) コマンドは、重複データを処理するためのコマンドです。その機能を確認するために、ここでは acorns.csv ファイルの 1 列目を切り出して uniq コマンドを実行してみます。
cd ~/Desktop/takarabako/acorns_data
wc acorns.csv
202 203 5898 acorns.csv
cut -d "," -f 1 acorns.csv | head -n 5
tree
kunugi
kunugi
kunugi
kunugi
cut -d "," -f 1 acorns.csv | uniq
tree
kunugi
konara
shirakashi
arakashi
matebashii
acorns.csv は 202 行からなるデータですが、その 1 列目には 6 種類の値しか存在しないことがわかります。次に uniq コマンドにオプションを付けて、それぞれの値が何件分(何行)存在するかを調べてみます。
cut -d "," -f 1 acorns.csv | uniq -c
1 tree
18 kunugi
36 konara
42 shirakashi
92 arakashi
14 matebashii
この結果から、それぞれの樹種が何行ずつ含まれているかが確認できます。このように、UNIX コマンドを組み合わせて使用することで、マウス操作などを行わずに効率的にデータの中身を確認したり、データを加工したりすることが可能です。