「Linux標準教科書」でお勉強(第5章 その2)sort、uniq、tr

当ページのリンクには広告が含まれています。
「Linux標準教科書」でお勉強(第5章 その2)sort、uniq、tr

「Linux標準教科書」の第5章は「基本的なコマンド2」です。

ここでは、主にテキストファイルを処理するのに便利なコマンドが紹介されています。

今回は、その中のsortコマンドとuniqコマンド、trコマンドを勉強したので、私なりにまとめて紹介します。

「Linux標準教科書」を読んで分からなかったところは別で調べて、自分で分かるように付け足したりしてまとめましたので、「Linux標準教科書」の勉強の補助として私の記事を利用していただけると幸いです。

目次

sortコマンド(テキストファイルの中身の表示をソート(並び替える))

sortコマンドは、テキストファイルの中身をソート(並び替え)します。

とりあえず、Linux標準教科書にならって、sortコマンドを実行させるscoreというファイルを、catコマンドを使って作ります。(終了はCtrl+dキー)

scoreファイルの作成

作成したscoreファイルに対して、オプションなしでsortコマンドを実行すると、各行の1文字目をアルファベット順にソート(並び替え)します。

書式は、以下の通り。

$  sort ソートするファイル名

実際にやってみたターミナルの表示は以下の通り。

sortコマンドをオプションなしで実行した結果

見事に各行の1文字目のアルファベット順にソートされました。

ここでひとつ疑問がわきました。

「これって、表示だけがソートされるの?」
「それとも、テキストファイルそのものがソートされてから表示されたの?」

ということで、sortコマンドを実行した後にcatコマンドでscoreファイルを確認しました。

sortコマンドが標準出力なのか確認

scoreファイルの中身に変化はなく、ターミナルへの標準出力(表示)だけがソートされていることがわかりました。

Linux標準教科書には「テキストファイルの中身をソート(並び替え)する」と書いてありましたが、もう少し詳しく書くと、この章の見出しの通り、「テキストファイルの中身の表示を並び替える」ということになります。

sortコマンドにもオプションがあり、Linux標準教科書には3つのオプションが紹介されています。

各オプションの使い方は以下の通り。


■テキストファイルの中身の表示を逆順にソートする

$  sort -r ソートするファイル名


■テキストファイルの中身の表示を任意の列でソートする

$  sort -k ソートに使う列(左から何番目か) ソートするファイル名

-kオプションは、空白文字を列の区切りとして認識しています。
このため、ソートするファイルの中身は、空白で区切られている必要があります。

■テキストファイルの中身の表示を、任意の列で逆順でソートする

$  sort -k ソートに使う列 -r ソートするファイル名

sortコマンドは複数のオプションを組合すことができるので、上記のような使い方も可能です。


■テキストファイルの中身の表示を数値式でソートする

$  sort -n ソートするファイル名

sortコマンドで注意しなくてはならないのが、数字に対して使用すると、思った通りにソートされないということです。

これは、sortコマンドが「辞書式ソート」という文字を辞書に出てくる順にソートするようにできているからです。

試しにscoreファイルの3列目の数字でソートしてみましょう。

数字を単にsortした場合

ご覧のとおり、人間が考えた数字の順番と違って表示されます。
これではソートの意味がありません。
ではどうするかというと、「数値式ソート」というものを使います。

「数値式ソート」は数値としてソートする方法で、-nオプションを付けると使用できます。

今度は-nオプションを付けてscoreファイルを3列目でソートしてみましょう。

数字を数値式にsortした場合

やっと思った通りの順番にソートできました。

sortコマンドを実行する際は、対象のデータが文字か数字か確認し、適切なオプションを使用しましょう。

uniqコマンド(行の重複の消去)

uniqコマンドは、直前の行と同じ内容があった場合、対象行を出力しないようにして、連続している同じ内容の行を、1行にまとめます。

と、Linux標準教科書に書かれていますが、わかりづらいですよね。

「同じ内容の行が連続している部分は、1行だけ残して、ファイルの中身全体を表示する」と言い換えていいのではないでしょうか。

書式は、以下の通り。

$  uniq 表示させるファイル名

こちらも、Linux標準教科書にならってcatコマンドでuniq-sampleファイルを作成し、uniqコマンドを実行してみます。

uniqコマンドの実行結果

CCCが連続していた部分が1行だけ表示されました。
そして、ファイルの中にAAAという行が2つありますが、連続していないため、2行とも表示されています。

trコマンド(文字の置き換え)

trコマンドは、標準入力からデータを文字ごとに置き換えます。

置き換える元のデータは標準入力からのデータを対象とするため、trコマンド単体では使えません。
catコマンドとパイプで繋いだり、リダイレクトでtrコマンドに標準入力する必要があります。

catコマンドを使ってtrコマンドを実行する場合の書式は以下の通り。

$  cat 置き換えるファイル名 | tr 元の文字 置き換える文字

リダイレクトを使ってtrコマンドを実行する場合の書式は以下の通り。

$  tr 元の文字 置き換える文字 < 置き換えるファイル名

こちらも、Linux標準教科書にならってcatコマンドでtranslateファイルを作成します。

translateファイルの作成

その後、以下のようにtrコマンドを実行します。

catコマンドを使ってonをONに置き換え
リダイレクトを使ってieをIEに置き換え

実行した結果は以下の通り。

trコマンドの実行結果

実行した結果を見ると、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というファイルに出力してみましょう。

trコマンドをファイルにリダイレクト

translateファイルには変更が記録されず、translate2ファイルに出力されました。

まとめ

「Linux標準教科書」の第5章は「基本的なコマンド2」です。

ここでは、主にテキストファイルを処理するのに便利なコマンドが紹介されています。

今回は、その中のsortコマンドとuniqコマンド、trコマンドの3つを勉強したので、私なりにまとめて紹介しました。

「Linux標準教科書」を読んで分からなかったところは別で調べて、自分で分かるように付け足したりしてまとめましたので、「Linux標準教科書」の勉強の補助として私の記事を利用していただけると幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次