Sort

對 + 和 - 等特殊字元進行排序

  • January 19, 2020

我有一個由幾行和幾列組成的文件。列由 \t 分隔。現在我想根據第二列對文件進行排序,例如sort -f -t$'\t' -k2 file.txt. 但是,第二列包含以下值:+o-。如何進行排序,使其+位於頂部、o中間和-底部?

此外,我還有另一列,比如第 5 列,並且想對該列的文件進行排序。但是,我想指定我的個人順序,即n在頂部、s中間和l底部。

如果有一個程序可以有效地實現我的目標,我會更喜歡那個解決方案。否則我正在尋找一個自寫的函式。

我們仍然可以使用sort,以防它是一個大文件:

#!/usr/bin/env bash

perl -F'\t' -ne '{$F[1] =~ s/o/,/; $F[4] =~ s/l/t/; print join "\t",@F}' file|\
sort -t $'\t' -k 2,2 -k 5,5 |\
perl -F'\t' -ne '{$F[1] =~ s/,/o/; $F[4] =~ s/t/l/; print join "\t",@F}'

第一個 perl 腳本在第二列變為第五列,o以準備排序。,``l``t

第二個 perl 腳本變回來了。

有一種技術稱為 DSU、decorate-sort-undecorate 或 Schwartzian 變換。

基本方法是發明您自己的替代鍵,它可以是您的數據的任意組合(從您的記錄的任何部分提取,可能依賴於其他欄位)。這些只需按所需的重要性順序排列即可。例如,零填充數字欄位通常很有幫助。您可以通過將輸入行號添加為最終子鍵來使最終訂單穩定。所有記錄的總密鑰長度需要相同。

然後根據 -k1.1 順序(整條記錄)對它們進行排序。這通常比多鍵排序更快,因為通常排序將為每次比較重建兩個多鍵。

最後,您通過切斷固定長度的裝飾來取消裝飾排序的輸出。

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