在bash上排序版本字符串

用户名

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[@]}"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Bash按降序对发行版本字符串进行排序

来自分类Dev

使用Bash解析Hadoop版本字符串

来自分类Dev

Azure Cosmos DB-按版本字符串排序

来自分类Dev

Bash脚本字符串扩展

来自分类Dev

版本在FreeBSD上排序?

来自分类Dev

autoconf中的库版本字符串

来自分类Dev

Linux内核:内核版本字符串,后接“ +”或“ -dirty”

来自分类Dev

Composer AWS无效版本字符串^ 5.3

来自分类Dev

如何更改内核的版本字符串?

来自分类Dev

“ {{FSharpCoreShippedPackageVersion}}”不是有效的版本字符串

来自分类Dev

从奇怪的版本字符串中提取数字

来自分类Dev

错误:版本字符串'$ {noSnapshotVersion}'无效

来自分类Dev

bundler gem 悲观语义版本字符串 ~>1.7.15

来自分类Dev

在php中对文本字符串进行排序

来自分类Dev

无法通过从 bash 调用 perl oneliner 来比较两个版本字符串

来自分类Dev

使用字符串比较来比较语义版本字符串是否可靠

来自分类Dev

GL_VERSION字符串和glxinfo版本字符串不同吗?

来自分类Dev

使用awk替换bash中的文本字符串

来自分类Dev

Bash脚本字符串比较运算符

来自分类Dev

Bash 脚本字符串引用错误

来自分类Dev

带有列表的bash脚本字符串操作

来自分类Dev

警告:未知版本字符串[3.1]。将使用默认版本

来自分类Dev

无法解析版本约束〜xx:无效的版本字符串“〜xx”

来自分类Dev

UnexpectedValueException无法解析版本约束mybranch:无效的版本字符串“ mybranch”

来自分类Dev

警告:未知版本字符串[3.1]。将使用默认版本

来自分类Dev

Excel公式,该公式返回给定版本字符串的父版本

来自分类Dev

SQL排序版本数字+字符串

来自分类Dev

如何从三个整数生成constexpr版本字符串(或git / SVN commit / rev字符串)?

来自分类Dev

字符串排序

Related 相关文章

  1. 1

    如何使用Bash按降序对发行版本字符串进行排序

  2. 2

    使用Bash解析Hadoop版本字符串

  3. 3

    Azure Cosmos DB-按版本字符串排序

  4. 4

    Bash脚本字符串扩展

  5. 5

    版本在FreeBSD上排序?

  6. 6

    autoconf中的库版本字符串

  7. 7

    Linux内核:内核版本字符串,后接“ +”或“ -dirty”

  8. 8

    Composer AWS无效版本字符串^ 5.3

  9. 9

    如何更改内核的版本字符串?

  10. 10

    “ {{FSharpCoreShippedPackageVersion}}”不是有效的版本字符串

  11. 11

    从奇怪的版本字符串中提取数字

  12. 12

    错误:版本字符串'$ {noSnapshotVersion}'无效

  13. 13

    bundler gem 悲观语义版本字符串 ~>1.7.15

  14. 14

    在php中对文本字符串进行排序

  15. 15

    无法通过从 bash 调用 perl oneliner 来比较两个版本字符串

  16. 16

    使用字符串比较来比较语义版本字符串是否可靠

  17. 17

    GL_VERSION字符串和glxinfo版本字符串不同吗?

  18. 18

    使用awk替换bash中的文本字符串

  19. 19

    Bash脚本字符串比较运算符

  20. 20

    Bash 脚本字符串引用错误

  21. 21

    带有列表的bash脚本字符串操作

  22. 22

    警告:未知版本字符串[3.1]。将使用默认版本

  23. 23

    无法解析版本约束〜xx:无效的版本字符串“〜xx”

  24. 24

    UnexpectedValueException无法解析版本约束mybranch:无效的版本字符串“ mybranch”

  25. 25

    警告:未知版本字符串[3.1]。将使用默认版本

  26. 26

    Excel公式,该公式返回给定版本字符串的父版本

  27. 27

    SQL排序版本数字+字符串

  28. 28

    如何从三个整数生成constexpr版本字符串(或git / SVN commit / rev字符串)?

  29. 29

    字符串排序

热门标签

归档