sortコマンドをもっと使いこなす

スポンサーリンク
スポンサーリンク

sortコマンドは、カンマ区切りデータ(CSV)や、タブ区切りデータ(TSV)の指定のフィールド(列)でソート出来ます。
またフィールド(列)は複数指定でき、それぞれ数値か文字列でのソートかも指定できます。
このようなソートを行うためのsortコマンドの使い方についてです。

スポンサーリンク

オプション

各フィールド(列)のセパレーターの指定

デフォルトは空白区切りですが、セパレーターを空白以外にする場合は、-t オプションで指定します。
CSV の場合は、「-t ,」とします。
TSV の場合は、「-t $’\t’」 とします。$ を付け忘れないでください。

ソート対象のフィールド(列)の指定

-k オプションでソート対象のフィールド(列)を指定します。
何番目のフィールド(列)をソート対象とするかを番号で指定します。番号は1番から数えます。
manコマンドでは 0番からと説明されていますが、実際は1番からです。

-k POS1[,POS2] の書式で、’POS1’列から’POS2’列が対象になります。POS2 が省略された場合は、行末までの列になります。

複数フィールド(列)を指定する場合は、-k オプションを列挙します。

ソート方法が数値/文字列かの指定

デフォルトは文字列ソートです。
数値としてソートする場合は、-kオプションの最後に n を付けます。

-n オプションを指定すると、全てのフィールド(列)を数値としてソートします。

ソート例

サンプルファイルの内容

CSVファイル test2.csv

1,grape,99
3,orange,100
10,apple,555
5,banana,-5
2,kiwi,-9
7,pineapple,555

TSVファイル test2.tsv

1       grape   99
3       orange  100
10      apple   555
5       banana  -5
2       kiwi    -9
7       pineapple       555

例)TSVファイルの2列目を文字列としてソートする

$ sort -t $'\t' -k2,2 test2.tsv
10      apple   555
5       banana  -5
1       grape   99
2       kiwi    -9
3       orange  100
7       pineapple       555

TSV形式なので、各フィールド(列)のセパレーターがタブであることを -t $’\t’ で指定します。
-k2,2 で2列目を指定します。
-nオプションや -kにnオプションが無いので、デフォルトの文字列ソートが行われます。

例)CSVファイルの3列目を数値としてソートする

$ sort -t , -k3,3n test2.csv
2,kiwi,-9
5,banana,-5
1,grape,99
3,orange,100
10,apple,555
7,pineapple,555

CSV形式なので、各フィールド(列)のセパレーターがカンマであることを -t , で指定します。
-k3,3 で3列目を指定します。
-kにnオプションを付けているので、3列目で数値ソートが行われます。

例)CSVファイルの3列目を文字列としてソートする

$ sort -t , -k3,3 test2.csv
5,banana,-5
2,kiwi,-9
3,orange,100
10,apple,555
7,pineapple,555
1,grape,99

CSV形式なので、各フィールド(列)のセパレーターがカンマであることを -t , で指定します。
-k2,2 で2列目を指定します。
-n や -kにnオプションが無いので、デフォルトの文字列ソートが行われます。

例)CSVファイルの3列目,1列目の順で数値としてソートする

$ sort -t , -k3,3n -k1,1n test2.csv
2,kiwi,-9
5,banana,-5
1,grape,99
3,orange,100
7,pineapple,555
10,apple,555

CSV形式なので、各フィールド(列)のセパレーターがカンマであることを -t , で指定します。
-k3,3 と -k1,1 で3列目、1列目の順でのソートを指定します。
-kにnオプションを付けているので、数値ソートが行われます。

参考

Man page of SORT
sort コマンドのセパレータをタブにするには「-t $’\t’」

コメント

タイトルとURLをコピーしました