sortを理解する
sortはテキストの行を比較して並べ替えます。標準では数値の大小とは異なる文字の比較を行います。比較方法、キー、ロケールを明示すると、再現できる集計処理を作れます。例はGNU sort、LC_ALL=C、ASCII、LF改行を前提にします。
この単元で学ぶこと
- 文字順と数値順を区別する
- フィールドと比較キーを指定する
- 並替えと重複除去・元ファイル更新を区別する
本文解説
行を並べ替える printf 'b\na\nc\n' | sortはa、b、cの順です。一行を一つの比較対象として扱い、行の中の文字をばらばらにはしません。sort data.txtの結果は通常標準出力へ出るだけなので、元のdata.txtをそのまま書き換えるわけではありません。
数字も最初は文字 printf '2\n10\n1\n' | sortの結果は1、10、2です。文字比較では先頭が1の行が2より前になります。sort -nなら数値として1、2、10です。番号を単なる文字列として並べるのか、量として数値順にするのかで選びます。
逆順 sort -rは指定した比較順を逆にします。数値を大きい順にしたいならsort -nrです。-rだけで自動的に数値順へ変わるわけではありません。2、10、1を-rで並べると2、10、1、-nrなら10、2、1になります。
フィールドで比較 name,score形式のA,20とB,3ならsort -t, -k2,2nで二番目のフィールドを数値として比較します。-t,は区切り文字、-k2,2nは二番目だけをキーにして数値比較する指定です。-k2と終点を省くと行末までキーへ含まれるため、複数列のデータでは範囲を明示します。
キーが同じ場合 GNU sortは指定キーが等しい場合、既定で行全体による最後の比較を行います。sort -sを加えるとその比較を抑え、等しいキーの入力順を保ちます。B,5とA,5なら-t, -k2,2nではA,5が先になり、-sを加えると入力順B,5が先です。
重複の除去 sort -uは比較上同じと扱う行を一つにします。通常の行全体比較ならsort | uniqに似た使い方ですが、キーや数値比較を追加すると同値の定義が変わります。sort -n -uでは1と01が同値となる例があり、文字列として異なる表記を両方残す目的には適しません。
出力先を安全に分ける sort input.txt > output.txtなら元の入力を保って結果を別ファイルへ保存できます。sort input.txt > input.txtはシェルが先に入力ファイルを切り詰めるため危険です。GNU sort -oには出力先指定がありますが、学習では専用の別出力先にして件数と内容を照合します。
再現条件と検証 並び順はロケールに影響されます。実習ではLC_ALL=Cをコマンドの環境として指定し、短いASCII入力で確認します。未整列かの検査にはsort -c、報告を抑えた検査には-Cがあり、整列済みなら終了0、順序違反なら非0です。並替えを行う処理と確認だけの処理を分けます。
図解
重要ポイント
- 通常のsortは数値の大小順とは限らない。
- -nが数値比較、-rが比較順の反転。
- -tで区切り、-kでキー範囲を指定。
- -sは等しいキーの入力順を保つ。
間違えやすい点
- sort -rだけで数値降順になると思わない。
- キー比較付き-uを常に行全体の重複除去とみなさない。
- 入力ファイルへ>で直接上書きしない。
用語解説
- 比較キー
- 並替えで比較対象にする行の一部分。
- フィールド
- 区切りで分けた項目。
- 安定な並替え
- キーが等しいデータの元の順を保つ並替え。
- ロケール
- 文字比較等の地域・言語規則を定める環境。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。