簡體   English   中英

按字母順序排序bash參數

[英]Sorting bash arguments alphabetically

如何按字母順序排序bash參數?

$ ./script.sh bbb aaa ddd ccc

並把它放入一個數組,這樣我現在有一個數組{aaa,bbb,ccc,ddd}

你可以做:

A=( $(sort <(printf "%s\n" "$@")) )

printf "%s\n" "${A[@]}"
aaa
bbb
ccc
ddd

它正在使用步驟:

  1. arguments list ie排序, arguments list ie “$ @”`
  2. 在數組中存儲sort的輸出
  3. 打印排序的數組

我希望以下2行會有所幫助。

sorted=$(printf '%s\n' "$@"|sort)

echo $sorted

這將給你一個排序的cmdline args.I不知道為什么它需要:)

但無論如何它會對你的cmdlines進行排序

刪除了不需要的東西。

這是一個調用,打破了這里提出的所有其他解決方案:

./script.sh "foo bar" "*" "" $'baz\ncow'

這是一段可以正常工作的代碼:

array=()
(( $# )) && while IFS= read -r -d '' var
do
  array+=("$var")
done <  <(printf "%s\0" "$@" | sort -z)

由於似乎不太欣賞我減少分叉的努力,因此有一個比使用IFS解析和設置變量更好的解決方案

第1部分:非常簡短而強大的解決方案:

正如@rici在另一篇文章的評論中所建議的,我將-t參數添加到mapfile

mapfile -t args < <(sort < <(printf "%s\n" "$@"))

這也與白色空間有關。

樣品:

#!/bin/bash

 mapfile args < <(sort < <(printf "%s\\n" "$@")) 

mapfile -t args < <(sort < <(printf "%s\n" "$@"))

declare -p args

for (( i=0 ; i<${#args[@]} ;i++));do

  printf "%3d: %s\\n" $i "${args[i]%$'\\n'}" 

    printf "%3d: %s\n" $i "${args[i]}"

done

運行樣本:

/tmp/script ccc "a a" aaa ddd aa AA z aab
declare -a args='([0]="aa
" [1]="a a
" [2]="AA
" [3]="aaa
" [4]="aab
" [5]="ccc
" [6]="ddd
" [7]="z
")'
  0: aa
  1: a a
  2: AA
  3: aaa
  4: aab
  5: ccc
  6: ddd
  7: z

第2部分:非常快:純粹的bash方式(沒有叉子!)

Nota:當然,這不是更好,更強大的排序方式,但在很多情況下,這可以有效地使用。

如(至少)一個人似乎更喜歡a 之前進行排序aa ,這是編輯的取代z0

此示例僅限於前6個字符,但您可以用更大的數字替換6但添加相同數量的z

#!/bin/bash

sep='§'
for i;do
    a=${i//[^a-zA-Z0-9]/0}000000
    args[36#${a:0:6}]+=${args[36#${a:0:6}]+$sep}${i}
  done

IFS=$sep args=(${args[*]})
printf "%s\n" ${args[@]}

declare -p args

區分大小寫,您可以用64#替換36# 64#

工作樣本:

#!/bin/bash

sep=§
base=64
chars=8
fillc=0
usage() {
  cat <<eousage
Usage: $0 [-ai] [-p precision] [-s inner separator]
    -a     for sorting \`\`empty'' After (\`\`aa'' after \`\`aaa'')
    -i     for case Insensitive
    -p NUM tell the number of characters to compare (default: $chars)
    -s SEP let you precise inner separator, (default \`\`$sep'')
eousage
}

while getopts "iap:s:" opt;do case $opt in
    a ) fillc=z ;;
    i ) base=36 ;;
    p ) chars=$OPTARG ;;
    s ) sep=$OPTARG ;;
    * ) usage ; exit 1 ;;
  esac ; done ;
shift $[OPTIND-1]

printf -v cfill "%${chars}s"
cfill=${cfill// /$fillc}
for i;do
    a=${i//[^a-zA-Z0-9]/$fillc}$cfill
    idx=$[$base#${a:0:$chars}]
    args[$idx]+=${args[$idx]+$sep}${i}
  done

declare -p args
IFS=$sep args=(${args[*]})
declare -p args

for (( i=0 ; i++<${#args[@]} ;b));do
    printf "%3d: %s\n" $i ${args[i-1]}
  done

運行案例:

/tmp/script ccc aaa ddd aa AA z aab
declare -a args='([44667659878400]="aa" [44678397296640]="aaa" 
    [44679471038464]="aab" [53614076755968]="ccc" [58081916485632]="ddd" 
    [153931627888640]="z" [160803575562240]="AA")'
declare -a args='([0]="aa" [1]="aaa" [2]="aab" [3]="ccc" [4]="ddd" 
    [5]="z" [6]="AA")'
  1: aa
  2: aaa
  3: aab
  4: ccc
  5: ddd
  6: z
  7: AA

不區分大小寫:

/tmp/script -i ccc aaa ddd aa AA z aab
declare -a args='([805409464320]="aa§AA" [806014126080]="aaa" 
    [806074592256]="aab" [967216951296]="ccc" [1047818363904]="ddd" 
    [2742745743360]="z")'
declare -a args='([0]="aa" [1]="AA" [2]="aaa" [3]="aab" [4]="ccc" 
    [5]="ddd" [6]="z")'
  1: aa
  2: AA
  3: aaa
  4: aab
  5: ccc
  6: ddd

空排序

/tmp/script -ia ccc aaa ddd aa AA z aab
declare -a args='([806074592255]="aaa" [806135058431]="aab" 
    [807586246655]="aa§AA" [967277417471]="ccc" [1047878830079]="ddd" 
    [2821109907455]="z")'
declare -a args='([0]="aaa" [1]="aab" [2]="aa" [3]="AA" [4]="ccc" 
    [5]="ddd" [6]="z")'
  1: aaa
  2: aab
  3: aa
  4: AA
  5: ccc
  6: ddd
  7: z

精度:1個字符:

/tmp/script -iap1 ccc aaa ddd aa AA z aab
declare -a args='([10]="aaa§aa§AA§aab" [12]="ccc" [13]="ddd" [35]="z")'
declare -a args='([0]="aaa" [1]="aa" [2]="AA" [3]="aab" [4]="ccc" 
    [5]="ddd" [6]="z")'
  1: aaa
  2: aa
  3: AA
  4: aab
  5: ccc
  6: ddd
  7: z

和精度:10個字符:

/tmp/script -p 10 ccc aaa ddd aa AA z aab
declare -a args='([182958734861926400]="aa" [183002715327037440]="aaa" 
    [183007113373548544]="aab" [219603258392444928]="ccc" 
    [237903529925148672]="ddd" [630503947831869440]="z" 
    [658651445502935040]="AA")'
declare -a args='([0]="aa" [1]="aaa" [2]="aab" [3]="ccc" [4]="ddd" 
    [5]="z" [6]="AA")'
  1: aa
  2: aaa
  3: aab
  4: ccc
  5: ddd
  6: z
  7: AA

空白和其他字符:

/tmp/script -is @ ccc "a a" aaa ddd 'a*a' 'a§a' aa AA z aab
declare -a args='([784246302720]="a a@a*a@a§a" [805409464320]="aa@AA" 
    [806014126080]="aaa" [806074592256]="aab" [967216951296]="ccc" 
    [1047818363904]="ddd" [2742745743360]="z")'
declare -a args='([0]="a a" [1]="a*a" [2]="a§a" [3]="aa" [4]="AA" 
    [5]="aaa" [6]="aab" [7]="ccc" [8]="ddd" [9]="z")'
  1: a a
  2: a*a
  3: a§a
  4: aa
  5: AA
  6: aaa
  7: aab
  8: ccc
  9: ddd
 10: z

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM