metrics.csvを、カンマ区切りの第3フィールドだけをキーとして数値の大きい順に並べる。
第1・第2フィールドは比較キーに含めない。
api,east,9
web,west,120
db,east,45適切なGNU sortコマンドはどれか。
-tで区切り文字、-k3,3でキーの開始と終了を第3フィールドに限定する。nは数値比較、rは比較結果の逆順を指定する。
詳細解説
sort -t, -k3,3 metrics.csv第3フィールドを文字列として昇順比較するため、120より45や9が後になる。
誤りです。第3フィールドは選べていますが、比較は既定の文字列順です。
文字列では先頭文字から比べるため、9、45、120という数値順にはなりません。
sort -t, -k3,3n metrics.csv数値比較は行うが昇順なので、9、45、120の順になる。
誤りです。nにより数値として正確に比較できます。
rがないため小さい9から始まる昇順となり、大きい順という要件と逆です。
sort -t, -k3,3nr metrics.csv-t,で区切り、-k3,3で第3フィールドだけを選び、nとrで数値の降順にする。
正しい選択肢です。-t,と-k3,3で第3フィールドだけをキーにします。
nで数値比較し、rで逆順にするため120、45、9の順になります。
sort -t, -k2,2nr metrics.csv第2フィールドをキーにするため、求める数値列を比較しない。
誤りです。nとrは指定されていますが、-k2,2はeastやwestの列を選びます。
数値でない第2フィールドを比較しても、第3フィールドの値による並びにはなりません。
実際に確かめる
一時的な検証環境で実行できる例です。
printf '%s
' 'api,east,9' 'web,west,120' 'db,east,45' > metrics.csv
LC_ALL=C sort -t, -k3,3nr metrics.csv期待される結果
web,west,120
db,east,45
api,east,9理解のポイント
- -tによるフィールド区切り
- -k3,3でキー範囲を限定
- nとrは数値比較と逆順
確認時の注意
- 確認環境: GNU coreutils 9.x / LC_ALL=C
- 検証ではLC_ALL=Cを指定します。
- このデータは引用符を含まない単純なカンマ区切りを前提とします。
基礎のおさらい
キー範囲
-k3だけでは第3フィールドから行末までがキーになり得ます。-k3,3とすると終了も第3フィールドに固定できます。
文字列順と数値順
既定は文字の照合順です。桁数の異なる数値を値として並べるには-nが必要です。
ロケール
照合順や数値表記はロケールの影響を受けます。再現性が重要な処理ではLC_ALL=Cなどを検討します。