目标
我有一系列具有各种名称的文件。每个文件的名称都包含一个由1到4位数字组成的唯一整数。我想订购文件(通过显示他们的全名),但按照他们包含的号码排序。
示例
文件..
var_dump(
defined('\A\B::X') &&
array_key_exists('Y', \A\B::X) &&
array_key_exists('Z', \A\B::X['Y'])
);
..应列为
Hello54.txt
piou2piou.txt
hap_1002_py.txt
JustAFile_78.txt
darwin2012.txt
答案 0 :(得分:2)
您只需按数字部分排序即可。一种方法可能是消除非数字部分并构建数组。从好的方面来说,bash有稀疏数组,所以无论你添加成员的顺序如何,它们都会以正确的顺序出现。伪代码:
array[name_with_non_numerics_stripped]=name
print array
我快速而不小心的实施:
sortnum() {
# Store the output in a sparse array to get implicit sorting
local -a map
local key
# (REPLY is the default name `read` reads into.)
local REPLY
while read -r; do
# Substitution parameter expansion to nuke non-numeric chars
key="${REPLY//[^0-9]}"
# If key occurs more than once, you will lose a member.
map[key]="$REPLY"
done
# Split output by newlines.
local IFS=$'\n'
echo "${map[*]}"
}
如果你有两个成员具有相同的"数字"值,只打印最后一个。 @BenjaminW建议将这些条目与换行符一起附加。有点像...
[[ ${map[key]} ]] && map[key]+=$'\n'
map[key]+="$REPLY"
...取代上面的map[key]="$REPLY"
。