Sort

當排序不知道排序順序時,GNU排序穩定排序

  • July 31, 2019

我有一個兩列文件;該文件已經按照我想要的方式在第 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-

引用自:https://unix.stackexchange.com/questions/532848