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

この記事は生命科学研究を念頭においたLinuxシェルコマンドの初級記事で、前回までの続きになります。

今回は複数のコマンドを連結するパイプとコマンド置換を中心に、ファイルの移動・コピーをするコマンドや、検索をするgrepコマンドなどを紹介していきます。

ファイルの移動とコピー、削除

前回まで、つまりバイオ研究のためのLinuxシェルコマンド超入門 【まずはこの6コマンドから】生命科学のためのLinuxシェルコマンドの基本1 【リダイレクトとオプション】では、

mkdir ディレクトリの作成
touch ファイルの作成

について紹介しました。今回は、作ったファイルの移動・コピーと、削除の方法について見ていきます。

まずtouchコマンドでsample.txtという空のファイルを作り、これを新しく作ったtempというディレクトリの中に移動してみます。

移動はmvコマンド (moveの意) で行い、mv ファイル名 移動先のディレクトリという構文になります。

touch sample.txt
mkdir temp
mv sample.txt temp/

これを元に戻してみます。

mv temp/sample.txt .

ここで.は現在のディレクトリを意味する記号です。

mvの移動先としてディレクトリを指定するというのを見ましたが、ディレクトリ名ではなくファイル名にするとその名前に変更するというコマンドになります。

例えばsample.txtをsample2.txtに変更するには

mv sample.txt sample2.txt

ファイルをコピーする場合はcpコマンド (copyの意)を使います。使い方はmvとほぼ同じです。sample2.txtというファイルをコピーし、新しくsample2_copied.txtというファイルを作りたいなら

cp sample2.txt sample2_copied.txt

ファイルの削除はrmコマンド (remove) で行います。

今作ったsample2_copied.txtを削除するには

rm sample2_copied.txt

すると消去していいか聞かれるので、yn (yesかno) で答えます。

wcコマンドで行数・単語数を数える

wcコマンドを使えば、ファイルの中の行数や単語数を簡単に調べることができます。前回も使ったProtein1.fastaというファイルを題材にwcコマンドの使い方を確認してみます。

wc Protein1.fasta

200714 6

出てくる3つの数字は、それぞれファイルの行数、単語数、バイト数 (容量) を意味しています。

wcコマンドにlオプションをつけると、行数だけ取り出すことができます (lはlineの意)。

wc -l Protein1.fasta

grepコマンドでマッチング

grepコマンドを使うことで、ファイルの中からある単語を検索することができます。
grep 検索単語 ファイル名という書き方になり、デフォルトでは該当する行が全部出力されます。

例えば前回も使ったProtein1.fastaという、あるタンパクのアミノ酸配列のFASTAファイルについて、ASという文字列を検索してみます。

grep AS Protein1.fasta

200714 1

少しわかりにくいですね。ASにマッチするところに色をつけてみます。これはgrepコマンドに–color=AUTOをつければ可能です。

grep --color=AUTO AS Protein1.fasta

ASを含む行がいくつあるのかを数えるには, grepコマンドのcオプションを使います (cはcountの意)。

grep -c AS Protein1.fasta

200714 2
ASが含まれる行を表示しましたが、もちろん含まれない行を抽出することもできます。それにはgrepコマンドのvオプションを使います。

grep -v AS Protein1.fasta

200714 8
ASを含まない行を抽出することができました。

パイプを使ってコマンドを連結する

コマンドの出力結果を次の任意のコマンドに引き渡すことができます。これをパイプといい| (エルではなく、¥キーのところにある記号) で表します。

先程のgrepコマンドとwcコマンドをパイプでつないで、ASが含まれている行の文字数を調べてみます。

grep AS Protein1.fasta | wc -c

これはまずgrep AS Protein1.fastaが実行され、ASを含む行についてwc -cを実行するということになります。

パイプは複数使うこともでき、例えばASを検索した後、sortコマンドに送り (アルファベットの昇順に並べかえるコマンドです), それをheadに送り (デフォルトでは最初の10行を表示するコマンドですが、今回は最初の3行に絞り込むというオプション-n 3がついています), そして文字数をwcコマンドで数えるには

grep AS Protein1.fasta | sort | head -n 3 | wc -c

と書くことで実行できます。

コマンド置換

以前書いたバイオ研究のためのLinuxシェルコマンド超入門 【まずはこの6コマンドから】という記事では、*によるワイルドカードやbrace展開を紹介していました。簡単におさらいすると、例えば

ls *.txt

と書くと自動的に.txtで終わるファイルと解釈されたり、

ls protein[1,2].fasta

と書いたら

ls protein1.fasta
ls protein2.fasta

と解釈されるというものでした。

このようなものをシェルの展開 (shell expansion) といいますが、shell expansionにはこれ以外によく使うものとしてコマンド置換 (command substitution) があります。

使い方はそれほど難しくなく、$(コマンド)と書くことで$()内のコマンドが先に実行され、その結果を使って次のコマンドを実行することができます。算数では ()の中を先に計算すると小学校で習いますが、同じように$()の中の方が優先順位が高いのです。

少し例を見ていきます。

例えば、

grep -c ">" Protein1.fasta 

は> を含む行の数を表示します。

このコマンドを先に実行して、その結果を次に使いたいときには$()の中に書いておけばいいというわけです。

echo "There are $(grep -c ">" Protein1.fasta) entries in my FASTA file."

この結果は

200714 3

という表示になります。

これは先に$()の中の

grep -c “>” Protein1.fasta

が実行され、その結果の1という数字を使って、次にechoコマンド

echo “There are 1 entries in my FASTA file.”

が実行されて表示されるということになっています。

今回使ったProttein1.fastaには1つのタンパク配列しか書かれていないのですが、一般には1ファイル中に複数の配列がまとめられていることの方が普通であり、それらの先頭は>で始まります。そのため、>の数を数えることで、配列が何個あるか調べることができます。

このコマンド置換を使えば、例えば今日の日付が入ったディレクトリを作成できます。
まず、日付はdateコマンドで取得可能です。

date

200714 4

dateコマンドには日付をどのように表示するかというさまざまなオプションがありますが、+%Fをつけることで日付の部分を別の形式で取得できるようになっています。

date +%F

200714 5

これを使えば、あとはディレクトリを作るコマンドであるmkdirにわたすことで

mkdir results-$(date +%F)

results-日付というフォルダを作成できています。念の為lsコマンドで目的のものができたか確認しておきます。

ls -ltr

関連図書

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

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

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

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