sortコマンドはよく使うコマンドですね。今回はsortコマンドのオプション等を解説します。
検証OS:Amazon Linux 2
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
sortコマンドのバージョン
$ sort --version
sort (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
目次
sortコマンドはこんな時に使える!
- Linux上のファイルをソート出来る
- 例えばローカル環境にある大容量のCSVファイル等があった時に、100万行以上あるからExcelじゃ出来ない、とかExcel重いからPCのリソース(CPU、メモリ、DISKIO等)を使わずに裏でソートさせておくことが出来る
- uniqコマンドとセットで重複を排除できる
- head/tailコマンドとセットで上位100件等を取得できる
等、色々と使い道があります。様々な場面でソートというのは必要になります。こういう細かい作業をササっと消化できるようになりましょう。今までの経験で得た知識を組み合わせて自分の技術にしましょう。
オプション一覧
オプション | ロングオプション | 説明(manより) |
---|---|---|
-b | –ignore-leading-blanks | 先頭の空白を無視する |
-d | –dictionary-order | 空白および英数字のみ含まれていると仮定する |
-f | –ignore-case | 大文字・小文字を区別しない |
-g | –general-numeric-sort | 一般的な数値として比較を行う |
-i | –ignore-nonprinting | 表示可能な文字のみ比較を行う |
-M | –month-sort | 月名でソートする。(不明) < ‘JAN’ < … < ‘DEC’ の順 |
-h | –human-numeric-sort | 人間が読むことができる形式の数値を比較する (例: 2K 1G) |
-n | –numeric-sort | 文字列を数値とみなして比較する |
-R | –random-sort | キーのランダムハッシュ順にソートする |
-r | –reverse | 逆順にソートを行う |
-V | –version-sort | 自然な (バージョン) 数字順でソートする |
-c | –check, –check=diagnose-first | 入力がソートされているかを確認する。ソート は行わない |
-C | –check=quiet, –check=silent | -c と同様だが、正しくソートされていない最初の行を出力しない |
-k | –key=KEYDEF | 指定されたキーでソートする。KEYDEF では場所と並び替え種別を指定する |
-m | –merge | ソートされたファイルを併合する。ソート自体は行わない |
-o | –output=FILE | 結果を標準出力の代わりに FILE に書き込む |
-s | –stable | 前の比較結果に頼らない安定的な並び替えを行う |
-S | –buffer-size=SIZE | 主記憶のバッファの大きさとして SIZE を使用する |
-t | –field-separator=SEP | フィールド区切り文字として空白の代わりに SEP を使用する |
-T | –temporary-directory=DIR | 一時ディレクトリとして $TMPDIR または /tmp ではなく DIR を使用する。オプションを複数指定すると、複数のディレクトリを指定できる |
-u | –unique | -c と併せて使用した場合、厳密に順序を確認する。-c を付けずに使用した場合、最初の同一行のみ出力する |
-z | –zero-terminated | 文字列の最後に改行でなく NULL 文字を付加する |
使用例
ls -l結果をサイズ順に並べ替える(-kオプション、-nオプション、-rオプション)
※lsコマンドのオプションでも出来ますが例として。
・ls -lの結果
# ls -l
合計 16
-rw-r--r-- 1 root root 4 11月 10 04:40 aaaaa.dat
-rw-r--r-- 1 root root 63 11月 10 04:41 bbbbb.dat
-rw-r--r-- 1 root root 9 11月 10 04:41 ccccc.dat
-rw-r--r-- 1 root root 150 11月 10 04:42 ddddd.dat
・サイズ順(昇順)
-kで4カラム目を指定して、-nで数値比較して並べ替えています。(-kオプションの4,4は後で説明します)
# ls -l | sort -k 4,4n
-rw-r--r-- 1 root root 4 11月 10 04:40 aaaaa.dat
-rw-r--r-- 1 root root 9 11月 10 04:41 ccccc.dat
-rw-r--r-- 1 root root 63 11月 10 04:41 bbbbb.dat
-rw-r--r-- 1 root root 150 11月 10 04:42 ddddd.dat
・サイズ順(降順)
-rオプションで降順にしています。
# ls -l | sort -k 4,4nr
合計 16
-rw-r--r-- 1 root root 150 11月 10 04:42 ddddd.dat
-rw-r--r-- 1 root root 63 11月 10 04:41 bbbbb.dat
-rw-r--r-- 1 root root 9 11月 10 04:41 ccccc.dat
-rw-r--r-- 1 root root 4 11月 10 04:40 aaaaa.dat
csvファイルを並べ変える
・並べ変える元ファイル(業務でこんなぐちゃぐちゃになっていることはないと思いますが。。)
※商品名,単価,数量,合計金額,日付といった例です。
# cat eeeee.csv
BBBB,152,107,16264,2021/11/19
EEEEEE,809,55,44495,2021/11/11
AAA,523,43,22489,2021/11/17
BBBB,152,47,7144,2021/11/13
AAA,523,68,35564,2021/11/13
AAA,523,24,12552,2021/11/10
BBBB,152,96,14592,2021/11/10
BBBB,152,105,15960,2021/11/19
BBBB,152,86,13072,2021/11/15
・売れた数(3カラム目)順に並べ替えよう
-tオプションでセパレータにカンマを指定して、-kオプションで3カラム目で数値のnを入れて降順のrを入れてとすると
# sort -k 3n -t , eeeee.csv
BBBB,152,107,16264,2021/11/19
BBBB,152,105,15960,2021/11/19
BBBB,152,96,14592,2021/11/10
BBBB,152,86,13072,2021/11/15
AAA,523,68,35564,2021/11/13
EEEEEE,809,55,44495,2021/11/11
AAA,523,43,22489,2021/11/17
AAA,523,24,12552,2021/11/10
BBBB,152,47,7144,2021/11/13
並び変わっていない!!24の下に47が!これ、結構はまる落とし穴です。-kオプションは -k m,n と指定します。nの指定がない場合は最終カラムまで指定されたもの、と認識されます。この例では、3~5カラム目迄を1つの数値として並べ替えたことになります。正しくはこのように指定します。
# sort -k 3,3nr -t , eeeee.csv
BBBB,152,107,16264,2021/11/19
BBBB,152,105,15960,2021/11/19
BBBB,152,96,14592,2021/11/10
BBBB,152,86,13072,2021/11/15
AAA,523,68,35564,2021/11/13
EEEEEE,809,55,44495,2021/11/11
BBBB,152,47,7144,2021/11/13
AAA,523,43,22489,2021/11/17
AAA,523,24,12552,2021/11/10
複数キーで並べ替える
先ほどのcsvファイルを例に、商品名で並べ替えた後に合計金額降順とするとこのようになります。
# sort -k 1,1 -k 4,4nr -t , eeeee.csv
AAA,523,68,35564,2021/11/13
AAA,523,43,22489,2021/11/17
AAA,523,24,12552,2021/11/10
BBBB,152,107,16264,2021/11/19
BBBB,152,105,15960,2021/11/19
BBBB,152,96,14592,2021/11/10
BBBB,152,86,13072,2021/11/15
BBBB,152,47,7144,2021/11/13
EEEEEE,809,55,44495,2021/11/11
簡単ですね。
sortの注意事項
sortはリソース食う
ソートというのは基本的に重い処理と思ってください。大容量ファイルをソートするときなどは、CPU、メモリ、ディスク等に注意して実施してくださいね。(ソートのアルゴリズムを理解するといいと思います。)
(基本ですが)-kオプションにはまらないように
私がなんでソート出来ないんだーとはまったことあるので、注意事項として。
コメント