回答:
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は開始したコマンドを追跡できます)seq 30 | xargs -L1 bash -cs 'yes $1 | head -1000000 | paste - <(seq 1000000) | shuf' bash
あなたは使うことができシュワルツ変換(これは基本的にあるよりも飾るソート-undecorateあなたはコメントで示唆したアプローチが、おそらくよりパフォーマンスmuruの 罰金の答えを伴う単一使用して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-
awk -v OFS="\t" '$1 != prev { key++ } { print key, $0; prev = $1 }
(未テスト)のようなもの。