STRINGS.txt的示例内容:
3.0.3
3.0.11.2
3.0.11.1
3.0.11
3.0.16
3.0.15.1
3.0.15
3.0.14
3.0.10.3
3.0.10.2
3.0.10.1
3.0.13.1
3.0.10
3.0.13
3.0.9
3.0.12
3.0.8
3.0.7.2
3.0.7.1
3.0.7
3.0.9.2
3.0.9.1
3.0.2
3.0.8.1
3.0.6.1
3.0.6
3.0.5
3.0.1
3.0.0
是否可以仅使用bash对所有这些版本字符串进行排序,而最新版本位于顶部?
这是可能的,但工作量却很愚蠢。如果您使用GNU排序:
sort -V -r <STRINGS.txt
…将完全按照您的要求进行。
现在,如果您 真的 没有任何外部工具,那么您将遇到麻烦。Freenode的#bash
IRC频道上的BlastHardcheese已在本机bash中编写了以下quicksort算法,出于可读性的考虑,我对其进行了修改,以使该compare
函数具有可替换性,并使用Bash
4.3 namevars使其能够与可配置变量名一起使用(当然,后面的更改意味着需要一个非常新的bash版本):
# this needs to be replaced for this particular case
compare(){
(( $1 >= $2 ))
}
swap(){
declare -n a=$1
local t
t=${a[$2]}
a[$2]=${a[$3]}
a[$3]=$t
}
partition(){
declare -n a=$1
local c p x
p=${a[$4]}
c=$2
swap "$1" "$3" "$4"
for((x=$2;x<$3;x++)); do
if ! compare "${a[x]}" "$p"; then
swap "$1" "$x" "$c"
((c++))
fi
done
swap "$1" "$2" "$c"
n=$c
}
quicksort(){
declare -n a=$1
(( "$2" >= "$3" )) && return
local i n
i=$((($2+$3)/2))
partition "$1" "$2" "$3" "$i"
quicksort "$1" "$2" "$((n-1))"
quicksort "$1" "$((n+1))" "$3"
}
…实现自己的比较功能,然后就可以采用了。
要仅处理您在此处显示的情况:
# we want to return 0 if the first version is equal or later than the second
version_compare(){
local -a first second
# Let's start with trivial cases:
if [[ $1 = "$2" ]] || [[ $1 = "$2".* ]]; then : "$1 >= $2"; return 0; fi
IFS=. read -r -a first <<<"$1"
IFS=. read -r -a second <<<"$2"
local k
for k in "${!first[@]}"; do
local a=${first[$k]} b=${second[$k]}
: "Evaluating field $k ($a vs $b)"
if [[ ! $b ]]; then
# ie. first=1.1.1, second=1.1; though this should have been handled above
: "$1 >= $2"; return 0;
fi
if (( $b > $a )); then
: "$1 < $2"; return 1;
fi
done
: "$1 >= $2"; return 0;
}
compare() {
version_compare "$2" "$1" # reverse sort order
}
假设bash 4,执行文件IO:
readarray -t versions <STRINGS.txt
quicksort versions 0 "$(( ${#versions[@]} - 1 ))"
printf '%s\n' "${versions[@]}"
问题内容: 我一直试图在bash中的制表符分隔文件的每一列中获取唯一值。因此,我使用了以下命令。 它工作正常,我可以在列中获取唯一值,其计数如下 我要执行的操作不是按列值名称(在此示例中为OS名称)进行排序,而是要按计数对它们进行排序,并可能以这种输出格式将计数放在第二列中。因此它必须看起来像: 我该怎么做呢? 问题答案: 采用: 所述排序以相反的顺序,使用第一字段为数值。在简单地反转列的顺序。您
问题内容: 我正在尝试提交post变量的地方编写bash脚本,但是wget将其视为多个URL,我相信是因为它不是URLENCODED …这是我的基本思想 我遇到了错误,alert.php没有得到post变量,而且它还很糊糊地说 无法解决我无法解决我无法解决尝试..依此类推。 上面的示例是一个简单的sudo示例,但我相信如果可以对其进行url编码,它将通过,我什至尝试了php: 但PHP错误了..任
问题内容: 我想按用户区域在字符串列表下面进行排序 对于不同的用户区域设置,排序输出应与该区域设置不同。 如何按用户区域排序以上列表? 我试过了 但这不适用于本地化,因此如何将locale参数传递给或有其他有效方法? 问题答案: 您可以对自定义比较器使用排序。请参阅整理器界面 整理器是一个比较器,可以直接传递给该方法。
问题内容: 我有一个名为 names 的字符串arraylist 。如何按字母顺序对arraylist排序? 问题答案: ArrayList names = new ArrayList (); names =fillNames() // whatever method you need to fill here; Collections.sort(names); http://download.o
为什么下面的bash代码不起作用? 预期产出:
在2004年7月27日, Chet Ramey 发布了Bash的第三版本. 它修复了许多bug并加入了一些新的属性. 增加的一些属性有: 新的,更特别的不可移植的 {a..z}花括号扩展(brace expansion)操作符. 1 #!/bin/bash 2 3 for i in {1..10} 4 # 比下面的更简单并且更易于理解 5 #+ for i in $