Sort
當排序不知道排序順序時,GNU排序穩定排序
我有一個兩列文件;該文件已經按照我想要的方式在第 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
您可以使用 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 可以跟踪它啟動的命令)
您可以使用Schwartzian 變換(這基本上是您在評論中提到的 decorate-sort-undecorate 方法,但由於使用單個呼叫而不是多個呼叫,可能比muru 的 好答案更高效) - 使用添加前綴列隨著第一列中值的變化而遞增,按前綴列排序,然後是“第二”列(由於前綴列的存在,其序號位置暫時轉移到),最後去掉前綴列
sort``awk``3
awk '{print ($1 in a? c+0: ++c)"\t" $0; a[$1]}' file | sort -k1,1n -k3,3 | cut -f 2-