Sort
對 + 和 - 等特殊字元進行排序
我有一個由幾行和幾列組成的文件。列由 \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 順序(整條記錄)對它們進行排序。這通常比多鍵排序更快,因為通常排序將為每次比較重建兩個多鍵。
最後,您通過切斷固定長度的裝飾來取消裝飾排序的輸出。