按字母和数字顺序对绝对目录路径进行排序

按字母和数字顺序对绝对目录路径进行排序

我很难在线找到使用字母和数字对绝对目录路径进行排序的解决方案。

示例如下,位于名为 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

答案1

如果您有 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

答案2

我的过程是将名称分成 2 个,然后排序并重新组合在一起

for fp in `cat test.txt | awk -F\. '{print $1}' | sort | uniq`; do grep $fp test.txt | sed 's/\./\ /g' | sort -nk2 | sed 's/\ /\./g' ;done
./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

相关内容