(21)【sort】シェルスクリプトコマンド活用紹介

sortコマンド

  • テキストファイルを並べ替える
  • 数値の大小で並べ替える
  • フィールドを指定して並べ替える
  • CSVデータを並べ替える

sortコマンド概要

sortは、テキストファイルを「行単位で並べ替える」コマンドです。他のコマンドの実行結果を並べ替える場合にも使用できます。また、空白やカンマ区切りのデータに対し、並べ替えに使用するフィールドを指定することも可能です。

sortコマンドの書式

sort [オプション] [ファイル……]

sortコマンドの主なオプション

オプション 意味
-r 逆順で並べ替える
-n 文字列を数値と見なして並べ替える
-u 同一行は1つ目だけを出力する
-k 指定 場所と並べ替え種別を指定する(「-k 2」なら2列目、「-k 2n」なら2列目を数値として並べ替える。複数指定する場合は「-k」オプションを複数回指定する)

sortコマンド詳細説明

テキストファイルを並べ替える

「sort ファイル名」で、ファイルを並べ替えます。逆順で並べ替えたい場合は「sort -r ファイル名」とします。

以下のファイルを並べ替えてみます。

A
B
A
B
C

実行結果は以下のとおりです。

$ cat baz.txt | sort
A
A
B
B
C

逆順にソートするには -r オプションを付けます。

$ cat baz.txt | sort -r
C
B
B
A
A

数値の大小で並べ替える

 sortコマンドのデフォルトでは、数字も文字と同じように並べ替えられます。例えば、「1」と「11」と「100」では、「1」→「100」→「11」の順番になります。これを数値として「1」→「11」→「100」の順で並べ替えるには、「-n」オプションを使用します。

seqコマンドで1から10までを出力します。

$ seq 10
1
2
3
4
5
6
7
8
9
10

では普通に並べ替えてみます。

$ seq 10 | sort
1
10
2
3
4
5
6
7
8
9

1の次に10が来てしまいました。文字を扱う並べ方でソートをしているからです。数値は数値を扱うことをsortコマンドに教えて上げる必要があります。 -n コマンドをつけます。n は numberのことです。

$ seq 10 | sort -n
1
2
3
4
5
6
7
8
9
10

フィールドを指定して並べ替える

 「-k」オプションを使うと、並べ替えに使用する「フィールド」を指定できます。例えば、duコマンドの結果の2番目のフィールド、つまり「ディレクトリ名」で並べ替えるには、「du -s * | sort -k 2」のように指定します。さらに、2番目のフィールドで逆順に並べ替えるならば、「du -s * | sort -k 2r」と指定します。

まずは以下のファイルを作成します。

2912	Applications
1519968	Calibre Library
24631656	Desktop
10141664	Documents
24	Downloads
872	Dropbox
0	Favorite

まずは最初のフィルド(ファイルサイズ)で並べ替えてみます。

$ cat du.txt | sort
0	Favorite
10141664	Documents
1519968	Calibre Library
24	Downloads
24631656	Desktop
2912	Applications
872	Dropbox

-n オプションを付けるのを忘れてしまいました。
次は -n オプションをつけて実行します。

$ cat du.txt | sort -n
0	Favorite
24	Downloads
872	Dropbox
2912	Applications
1519968	Calibre Library
10141664	Documents
24631656	Desktop

次は、2番目のフィールド(ディレクトリ名)で並べ替えを行います。

$ cat du.txt | sort -k2
2912	Applications
1519968	Calibre Library
24631656	Desktop
10141664	Documents
24	Downloads
872	Dropbox
0	Favorite
ヒント
sortコマンドはものすごく良く使います。たくさんのオプションがありますが、まずはここで紹介したオプションを覚えればほぼ問題はありません。必要になったらGoogleで検索してください。

CSVデータを並べ替える

 「-k」オプションでは、空白文字を区切りとして、並べ替えに使うフィールドを指定することができます。区切り文字を変更したい場合は、「-t」オプションで使用する文字を指定します。

 例えば、CSV(comma-separated values)データの場合、区切り文字は「,(カンマ)」なので「-t ,」または「-t “,"」のように指定します。

 なお、3番目のフィールドの値を数値として並べ替える場合は「-k 3n」、数値としてさらに逆順で並べ替えるなら「-k 3nr」のように指定します。

フィールドは以下のとおりです。
連番,氏名,氏名(カタカナ),性別,年齢,取得ポイント

$ cat test.csv
1,小出里歩,オデリホ,女,27,85
2,吉野里紗,ヨシノリサ,女,38,894
3,本郷末治,ホンゴウスエジ,男,56,252
4,谷村千代乃,タニムラチヨノ,女,44,556
5,内野響子,ウチノキョウコ,女,44,170
6,塩谷貢,シオタニミツグ,男,34,494
7,児島愛子,コジマアイコ,女,39,675
8,白木俊史,シラキトシフミ,男,57,245
9,飯塚遥佳,イイヅカハルカ,女,20,974
10,阿久津清蔵,アクツセイゾウ,男,9,120

sortコマンドでCSVデータを扱う場合は -t オプションを使います。
カンマ区切りの場合は -t, となります。

年齢で並べ替えてみます。

$ cat data.txt | sort -t, -nr -k5
8,白木俊史,シラキトシフミ,男,57,245
3,本郷末治,ホンゴウスエジ,男,56,252
5,内野響子,ウチノキョウコ,女,44,170
4,谷村千代乃,タニムラチヨノ,女,44,556
7,児島愛子,コジマアイコ,女,39,675
2,吉野里紗,ヨシノリサ,女,38,894
6,塩谷貢,シオタニミツグ,男,34,494
1,小出里歩,オデリホ,女,27,85
9,飯塚遥佳,イイヅカハルカ,女,20,974
10,阿久津清蔵,アクツセイゾウ,男,9,120

sort -t, -nr -k5
-t, は、CSVデータの区切り文字をカンマ(,)とする
-nr の、nは並べ替えのデータを数値として扱う
の、rは逆順で出力する
-k5 は、並べ替えのキーとなるフィールドを5列目とする

という意味です。
では、6列目の取得ポイントの多く順に並べ替えてみます。

bash-5.1$ cat data.txt | sort -t, -nr -k6
9,飯塚遥佳,イイヅカハルカ,女,20,974
2,吉野里紗,ヨシノリサ,女,38,894
7,児島愛子,コジマアイコ,女,39,675
4,谷村千代乃,タニムラチヨノ,女,44,556
6,塩谷貢,シオタニミツグ,男,34,494
3,本郷末治,ホンゴウスエジ,男,56,252
8,白木俊史,シラキトシフミ,男,57,245
5,内野響子,ウチノキョウコ,女,44,170
10,阿久津清蔵,アクツセイゾウ,男,9,120
1,小出里歩,オデリホ,女,27,85
ヒント
csvデータのカンマ区切りは見にくいですね。
工夫してタブ区切りに変換して出力してみてください。
$ cat data.txt | sort -t, -nr -k6 | tr "," "\t"
9	飯塚遥佳	イイヅカハルカ	女	20	974
2	吉野里紗	ヨシノリサ	女	38	894
7	児島愛子	コジマアイコ	女	39	675
4	谷村千代乃	タニムラチヨノ	女	44	556
6	塩谷貢	シオタニミツグ	男	34	494
3	本郷末治	ホンゴウスエジ	男	56	252
8	白木俊史	シラキトシフミ	男	57	245
5	内野響子	ウチノキョウコ	女	44	170
10	阿久津清蔵	アクツセイゾウ	男	9	120
1	小出里歩	オデリホ	女	27	85
ヒント
ちょっと見やすくなりました(^^;

書籍の紹介

(22)【jot】シェルスクリプトコマンド活用紹介

(22)【jot】シェルスクリプトコマンド活用紹介

(20)【wc】シェルスクリプトコマンド活用紹介

(20)【wc】シェルスクリプトコマンド活用紹介