Sort

按字母和數字順序對絕對目錄路徑進行排序

  • February 22, 2022

我很難線上找到使用字母和數字對絕對目錄路徑進行排序的解決方案。

範例是名為 test.txt 的文件中的以下內容

/opt/informix/data/dcdwhdev/rootdbs.2
/opt/informix/data/dcdwhdev/db1.1
/opt/informix/data/dcdwhdev/db1.10
/opt/informix/data/dcdwhdev/db1.11
/opt/informix/data/dcdwhdev/rootdbs.1
/opt/informix/data/dcdwhdev/db1.12
/opt/informix/data/dcdwhdev/db1.19
/opt/informix/data/dcdwhdev/db1.2
/opt/informix/data/dcdwhdev/db1.21
/opt/informix/data/dcdwhdev/db1.22
/opt/informix/data/dcdwhdev/db1.23
/opt/informix/data/dcdwhdev/db1.3
/opt/informix/data/dcdwhdev/db1.31
/opt/informix/data/dcdwhdev/db1.32
/opt/informix/data/dcdwhdev/db1.33

以下是我想要實現的目標:

/opt/informix/data/dcdwhdev/db1.1
/opt/informix/data/dcdwhdev/db1.2
/opt/informix/data/dcdwhdev/db1.3
/opt/informix/data/dcdwhdev/db1.10
/opt/informix/data/dcdwhdev/db1.11
/opt/informix/data/dcdwhdev/db1.12
/opt/informix/data/dcdwhdev/db1.19
/opt/informix/data/dcdwhdev/db1.21
/opt/informix/data/dcdwhdev/db1.22
/opt/informix/data/dcdwhdev/db1.23
/opt/informix/data/dcdwhdev/db1.31
/opt/informix/data/dcdwhdev/db1.32
/opt/informix/data/dcdwhdev/db1.33
/opt/informix/data/dcdwhdev/rootdbs.1
/opt/informix/data/dcdwhdev/rootdbs.2

如果您有 GNU sort(可能gsort在您的系統上被呼叫,或者位於/opt/gnu/bin目錄中,或者來自 IBM.com 上的coreutils RPM):

sort -V < test.txt

如果zsh可用(IBM.com 上的 RPM 包):

print -rC1 -- /(Nne['reply=(${(f)"$(<test.txt)"})'])

或者直接列出該目錄中的文件:

print -rC1 /opt/informix/data/dcdwhdev/*(Nn)

如果沒有,您可以使用perl例如:

perl -e '
 print $_->[1] for 
   sort {$a->[0] cmp $b->[0]}
     map {[s/\d+/sprintf "%06d", $&/ger, $_]} <STDIN>' < test.txt

我們通過比較所有十進制數字序列被零填充到 6 位之後的行來對列表進行排序。

如果文件中的行總是這樣的形狀,並且您只需要比較前面的部分並且只在.詞法上比較它,然後在數字上比較它之後的部分,那麼,您可以這樣做:

sort -t. -k1,1 -k2,2n < test.txt

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