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選定へ戻します。

コメント