2つの列で構成されるファイルがあります。ファイルは私が望む方法で列1にソートされています。列1の各カテゴリ内で列2をソートしたいと思います。ただし、sort
列 1 のソート順は認識されません。
(スタックに関する同様の質問からのものです)一般的なアプローチは次のとおりです。
sort --stable -k1,1 -k2,2n
ただし、k1 の順序は任意であるため指定できません。
入力例:
C 2
C 1
A 2
A 1
B 2
B 1
そして出力:
C 1
C 2
A 1
A 2
B 1
B 2
答え1
awk を使用して、各ブロックに対して新しいソートを開始できます。
% awk -v cmd="sort -k2,2" '$1 != prev {close(cmd); prev=$1} {print | cmd}' foo
C 1
C 2
A 1
A 2
B 1
B 2
$1 != prev {close(cmd); prev=$1}
- 保存された値が異なる場合、新しいブロックが作成されるため、以前に開始されたブロックをすべて閉じます。sort
{print | "sort -k2,2"}'
出力をにパイプsort
し、まだ実行されていない場合は開始します(awkは起動されたコマンドを追跡できます)。
答え2
使用できるシュワルツ変換(これは基本的にあなたの意見で言及されている装飾 - 整列 - 装飾なしのアプローチですが、おそらくそれよりも良いでしょう。ムルの 良い答えsort
複数の呼び出しの代わりに単一の呼び出しを使用するため) -awk
最初の列の値が変わるにつれて増分するプレフィックス列を追加し、プレフィックス列に基づいてソートします。以下は「2番目の」列です。(プレフィックス列の存在により序数位置が一時的に転送されます3
)最終的にプレフィックス列が削除されます。
awk '{print ($1 in a? c+0: ++c)"\t" $0; a[$1]}' file | sort -k1,1n -k3,3 | cut -f 2-