「Linux標準教科書」の第5章は「基本的なコマンド2」です。
ここでは、主にテキストファイルを処理するのに便利なコマンドが紹介されています。
今回は、その中のsortコマンドとuniqコマンド、trコマンドを勉強したので、私なりにまとめて紹介します。
「Linux標準教科書」を読んで分からなかったところは別で調べて、自分で分かるように付け足したりしてまとめましたので、「Linux標準教科書」の勉強の補助として私の記事を利用していただけると幸いです。
sortコマンド(テキストファイルの中身の表示をソート(並び替える))
sortコマンドは、テキストファイルの中身をソート(並び替え)します。
とりあえず、Linux標準教科書にならって、sortコマンドを実行させるscoreというファイルを、catコマンドを使って作ります。(終了はCtrl+dキー)
作成したscoreファイルに対して、オプションなしでsortコマンドを実行すると、各行の1文字目をアルファベット順にソート(並び替え)します。
書式は、以下の通り。
$ sort ソートするファイル名
実際にやってみたターミナルの表示は以下の通り。
見事に各行の1文字目のアルファベット順にソートされました。
ここでひとつ疑問がわきました。
「これって、表示だけがソートされるの?」
「それとも、テキストファイルそのものがソートされてから表示されたの?」
ということで、sortコマンドを実行した後にcatコマンドでscoreファイルを確認しました。
scoreファイルの中身に変化はなく、ターミナルへの標準出力(表示)だけがソートされていることがわかりました。
Linux標準教科書には「テキストファイルの中身をソート(並び替え)する」と書いてありましたが、もう少し詳しく書くと、この章の見出しの通り、「テキストファイルの中身の表示を並び替える」ということになります。
sortコマンドにもオプションがあり、Linux標準教科書には3つのオプションが紹介されています。
各オプションの使い方は以下の通り。
■テキストファイルの中身の表示を逆順にソートする
$ sort -r ソートするファイル名
■テキストファイルの中身の表示を任意の列でソートする
$ sort -k ソートに使う列(左から何番目か) ソートするファイル名
-kオプションは、空白文字を列の区切りとして認識しています。
このため、ソートするファイルの中身は、空白で区切られている必要があります。
■テキストファイルの中身の表示を、任意の列で逆順でソートする
$ sort -k ソートに使う列 -r ソートするファイル名
sortコマンドは複数のオプションを組合すことができるので、上記のような使い方も可能です。
■テキストファイルの中身の表示を数値式でソートする
$ sort -n ソートするファイル名
sortコマンドで注意しなくてはならないのが、数字に対して使用すると、思った通りにソートされないということです。
これは、sortコマンドが「辞書式ソート」という文字を辞書に出てくる順にソートするようにできているからです。
試しにscoreファイルの3列目の数字でソートしてみましょう。
ご覧のとおり、人間が考えた数字の順番と違って表示されます。
これではソートの意味がありません。
ではどうするかというと、「数値式ソート」というものを使います。
「数値式ソート」は数値としてソートする方法で、-nオプションを付けると使用できます。
今度は-nオプションを付けてscoreファイルを3列目でソートしてみましょう。
やっと思った通りの順番にソートできました。
sortコマンドを実行する際は、対象のデータが文字か数字か確認し、適切なオプションを使用しましょう。
uniqコマンド(行の重複の消去)
uniqコマンドは、直前の行と同じ内容があった場合、対象行を出力しないようにして、連続している同じ内容の行を、1行にまとめます。
と、Linux標準教科書に書かれていますが、わかりづらいですよね。
「同じ内容の行が連続している部分は、1行だけ残して、ファイルの中身全体を表示する」と言い換えていいのではないでしょうか。
書式は、以下の通り。
$ uniq 表示させるファイル名
こちらも、Linux標準教科書にならってcatコマンドでuniq-sampleファイルを作成し、uniqコマンドを実行してみます。
CCCが連続していた部分が1行だけ表示されました。
そして、ファイルの中にAAAという行が2つありますが、連続していないため、2行とも表示されています。
trコマンド(文字の置き換え)
trコマンドは、標準入力からデータを文字ごとに置き換えます。
置き換える元のデータは標準入力からのデータを対象とするため、trコマンド単体では使えません。
catコマンドとパイプで繋いだり、リダイレクトでtrコマンドに標準入力する必要があります。
catコマンドを使ってtrコマンドを実行する場合の書式は以下の通り。
$ cat 置き換えるファイル名 | tr 元の文字 置き換える文字
リダイレクトを使ってtrコマンドを実行する場合の書式は以下の通り。
$ tr 元の文字 置き換える文字 < 置き換えるファイル名
こちらも、Linux標準教科書にならってcatコマンドでtranslateファイルを作成します。
その後、以下のようにtrコマンドを実行します。
catコマンドを使ってonをONに置き換え
リダイレクトを使ってieをIEに置き換え
実行した結果は以下の通り。
実行した結果を見ると、onがONにではなく、oがOに、nがNに。
ieがIEにではなく、iがIに、eがEに置き換わっています。
これは、trコマンドが文字列単位ではなく、文字単位で置き換えるコマンドだからです。
このため、元の文字と置き換える文字は、
- 文字数が一緒であること
- 元の文字と置き換えたい文字の並びをそろえること
に注意しなくてはなりません。
$ tr abc ABC
と入力するのと、
$ tr a A
$ tr b B
$ tr c C
と意味は一緒ということです。
また、trコマンドは置き換えた結果をターミナルに標準出力しているだけなので、置き換えた結果をファイルに出力したい場合は、リダイレクトを使います。
先ほどのcatコマンドをパイプで繋いだコマンドをtranslae2というファイルに出力してみましょう。
translateファイルには変更が記録されず、translate2ファイルに出力されました。
まとめ
「Linux標準教科書」の第5章は「基本的なコマンド2」です。
ここでは、主にテキストファイルを処理するのに便利なコマンドが紹介されています。
今回は、その中のsortコマンドとuniqコマンド、trコマンドの3つを勉強したので、私なりにまとめて紹介しました。
「Linux標準教科書」を読んで分からなかったところは別で調べて、自分で分かるように付け足したりしてまとめましたので、「Linux標準教科書」の勉強の補助として私の記事を利用していただけると幸いです。