いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

sortコマンドで数値ソートする (bash)

概要

小ネタ。よく忘れるのでメモメモ。

連番が付与されているファイルが10個以上になると、普通に

ls -1 | sort

ってやっても、ちゃんとソートされません。

デフォルトでは後ろの番号部分も文字列として認識してソートしてしまうからですね。

これを「数値」として sort コマンドさんに認識してもらってソートするには以下のようにします。

ls -1 | sort -n -t . -k 2

-n が 数値ソート してと指示するオプション。 long-name だと --numeric-sort です。

-t が 区切り文字 を指定するオプション。 long-name だと --field-separator です。

-k が 何カラム目 を利用するかを指定するオプション。long-name だと --key です。

-k オプションは、昔は +1 とか +2 とかの指定でした。今でも使えると思います。

サンプル

#!/usr/bin/env bash

#
# sort コマンドでファイルの数値部分でソートする
#
# REFERENCES:
#   - https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
#   - https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html#dd-invocation
#
basedirpath=/tmp/try-linux/sort/numeric_sort

rm -rf "${basedirpath}"
mkdir -p "${basedirpath}"

## テスト用のファイルを生成
#
for ((i=0; i<15; i++))
do
    dd \
        if=/dev/zero \
        of="${basedirpath}/zero.bin.${i}" \
        bs=1024 \
        count=1 \
        2>/dev/null
done

## そのまま ls
#
# 数値部分を文字列で解釈するので数値順に並ばない
ls -1 "${basedirpath}"

echo '--------------------------------------------'

## オプション付けずに sort
#
# これも sort コマンドからすると何で並び替えるのかを指定していないので
# 結果は上の ls の場合と同じになる
ls -1 "${basedirpath}" | sort

echo '--------------------------------------------'

## オプションを付けて sort
#
# 以下のオプションを付与
#   - -n : --numeric-sort (数値でソート)
#   - -t : --field-separator (指定した文字をセパレータとして利用)
#   - -k : --key (ソート対象とするカラム位置)
ls -1 "${basedirpath}" | sort -n -t . -k 3

try-linux/numeric_sort.sh at master · devlights/try-linux · GitHub

実行すると以下のようになります。

gitpod /workspace/try-linux $ make
ENTER EXAMPLE NAME: numeric_sort

[INPUT ] numeric_sort
[TARGET] sort_numeric_sort
[SCRIPT] basic/sort/numeric_sort.sh

===== START [basic/sort/numeric_sort.sh] =====
zero.bin.0
zero.bin.1
zero.bin.10
zero.bin.11
zero.bin.12
zero.bin.13
zero.bin.14
zero.bin.2
zero.bin.3
zero.bin.4
zero.bin.5
zero.bin.6
zero.bin.7
zero.bin.8
zero.bin.9
--------------------------------------------
zero.bin.0
zero.bin.1
zero.bin.10
zero.bin.11
zero.bin.12
zero.bin.13
zero.bin.14
zero.bin.2
zero.bin.3
zero.bin.4
zero.bin.5
zero.bin.6
zero.bin.7
zero.bin.8
zero.bin.9
--------------------------------------------
zero.bin.0
zero.bin.1
zero.bin.2
zero.bin.3
zero.bin.4
zero.bin.5
zero.bin.6
zero.bin.7
zero.bin.8
zero.bin.9
zero.bin.10
zero.bin.11
zero.bin.12
zero.bin.13
zero.bin.14
===== END   [basic/sort/numeric_sort.sh] =====

DONE

参考情報

www.gnu.org


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com