Linuxでファイルの内容を数値順にソートする方法と応用例

Linuxでファイルの内容を数値順にソートする方法と応用例の実務上の結論は「通常の数値はsort -n、exponent等は-g、K/M/G付きは-h、versionは-Vを使い分けます。key、separator、locale、同値時のtie-breakを明示します。」です。数値sortは-n、-g、-h、-Vで解釈が変わります。key、field separator、locale、tie-breakを固定し、headerや単位付き値を通常recordへ混ぜません。

目次

数値・general numeric・size・versionの分類

通常の整数・小数はsort -n、指数表記やNaN等を広く扱う場合は-g、K/M/G付きsizeは-h、version-like文字列は-Vを使い分けます。lexicographic sortの既定とは結果が異なります。対象列、separator、header、欠損、同値時の順序、localeを先に定義し、一つのoptionで全形式を混在処理しません。

一列はsort -n、tab区切り第二列は-tと-k2,2n、降順はr、同値の順序を保つ要件では-sや追加keyを検討します。–debugでkey解釈をsample確認します。$’ ‘はBash固有のANSI-C quoteなのでshell前提を明記します。quoted commaやmultiline recordを含むCSVはtext sortではなくCSV parserへ渡します。

numeric mode・key・separator・localeを固定する

  • 対象列の値formatと欠損を確認する
  • 数値・general numeric・human size・versionを分類する
  • field separatorとkey範囲を決める
  • localeと同値時順序を固定する

列schemaとdecimal表記が不明ならsortを実行しません。headerを分離し、NaN・指数・単位・version文字列をfixtureへ入れて、必要なmodeとLC_ALLを仕様として決めます。

-n・-g・-h・-Vの順序差をfixtureで見る

一列の数値を昇順

sort -n -- ./numbers.txt

数値として読めないprefixの扱いをsampleで確認します。

第二fieldを数値sort

sort -t $'\t' -k2,2n -- ./table.tsv

Bash quotingとtab separatorを明示します。

降順とtie-break

sort -t, -k3,3nr -k1,1 -- ./scores.csv

単純CSVだけを対象にし、quoted commaは専用parserへ渡します。

human-readable sizeをsort

sort -h -- ./sizes.txt

K、M、G等のsuffixを含む表示値向けです。

version文字列をsort

sort -V -- ./versions.txt

数値sortとは異なるversion比較として使います。

keyとlocaleを固定する

sort -nは数値比較、-gは浮動小数点表現を広く扱い、-hはsize suffix、-Vはversion-like文字列へ特化します。localeはdecimal point、collation、blank、character classへ影響します。同じkeyならlast-resortでline全体比較が入るため、-sや追加keyの意図を確認します。

-n、-g、-h、-Vは比較規則が違い、同じ文字列でも順序が変わります。数値として読めないprefix、空field、leading zero、decimal separator、NaNの位置を期待表へ明記します。同じkeyの場合にline全体のlast-resort比較が入る実装挙動もあるため、stableが必要ならoptionとtie-break keyを固定します。

headerまでdataとして並べる、separatorをshellが解釈する、localeでdecimal/collationが変わる、巨大fileでtemporary領域不足、途中書込み中のsourceを読む場合があります。sortが成功してもrecord数やfield数が変わっていれば入力parseの設計誤りです。stderr、status、temporary filesystem空き容量を確認します。

header・invalid field・temporary disk不足を分ける

  • sort既定を数値sortと思う
  • -nと-Vと-hを同じ結果と考える
  • headerまでdataとして並べ替える
  • locale差を無視する
  • 原本へ直接redirectしてtruncateする

invalid fieldを0とみなす実装差、header混入、一時directory不足を別に扱います。sort失敗時の部分出力を採用せず、disk容量とlocaleを直して同じ入力hashから再実行します。

sort結果を原本と同じredirectへ書かない

sort結果を原本へ同じredirectで書きません。別fileへ出力し、line数、hash、header位置、parse errorを検証します。quoted CSVやmultiline recordをtext sortせず、専用parserでrecordを保ちます。巨大fileではtemporary directoryの空き容量を確認します。

sort outputを原本と同じredirect先へ書くと、shellが入力を読む前にtruncateするため禁止します。別fileへ出力し、validate後にbackup付きで置換します。temporary directoryの容量と機密区分を確認し、secret dataを共有/tmpへspillしません。巨大fileではI/Oとdisk逼迫を監視し、上限超過で停止します。

原本を壊さないsort検証

negative、decimal、exponent、leading zero、NaN、blank、K/M/G、version、同値を含むsampleを作ります。sort –debugでkeyを確認し、期待順、line数、header、終了codeを比較します。

negative、decimal、exponent、leading zero、blank、invalid、K/M/G、version、同値、headerを含むfixtureを用意します。-n/-g/-h/-V/-kと–debugの期待順を表にし、localeを変えた差も確認します。出力line数、各recordのhash集合、header位置を原本と比較し、並べ替え以外の欠損や重複がないことを検証します。

jobではLC_ALLなどlocale、separator、key、numeric mode、header処理、tie-breakを明示します。input schemaを先にvalidateし、invalid/blank field件数を別artifactへ出します。candidate fileのline数、byte数、hash集合、sort順を確認してからatomicな反映へ進み、失敗時は原本を保持します。

値formatから数値sortかparserを選ぶ

単純数値は-n、scientific notationは-g、表示sizeは-h、versionは-V、構造化recordはparserを選びます。表示用に丸めた値より元のinteger fieldをsortする方が安全です。sort結果を正本へ反映する必要がある場合は、比較規則をdata contractとtestへ固定してから運用します。

合格は負数、同値、指数、human-readable単位、version、header fixtureが期待順になり、record集合が前後一致することです。一致しないrunは出力を破棄しmode選定へ戻します。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次