我在 bash 腳本中有一個陣列,例如
# myarr contains main elements (i.e. demo1, demo2) and "sub" elements (i.e. demo1%myspace1::myapp1)
# Inserting element in myarr occurs automatically in that order:
myarr=()
myarr =("demo1%myspace1::myapp1=param1#param2#param3")
myarr =("demo1%myspace1::myapp2=param1#param2#param3")
myarr =("demo1%myspace2::myapp1=param1#param2#param3")
myarr =("demo1=param1#param2#param3")
myarr =("demo2%myspace2::myapp1=param1#param2#param3")
myarr =("demo2%myspace2::myapp2=param1#param2#param3")
myarr =("demo2%myspace2::myapp3=param1#param2#param3")
myarr =("demo2=param1#param2#param3")
我想對其進行排序,以便“主”元素出現在“子”元素之前,例如:
"demo1=param1#param2#param3"
"demo1%myspace1::myapp1=param1#param2#param3"
"demo1%myspace1::myapp2=param1#param2#param3"
"demo1%myspace2::myapp1=param1#param2#param3"
"demo2=param1#param2#param3"
"demo2%myspace2::myapp1=param1#param2#param3"
"demo2%myspace2::myapp2=param1#param2#param3"
"demo2%myspace2::myapp3=param1#param2#param3"
之后,我想像這樣列印陣列:
demo1=param1#param2#param3
|
-- demo1%myspace1::myapp1=param1#param2#param3
-- demo1%myspace1::myapp2=param1#param2#param3
-- demo1%myspace2::myapp1=param1#param2#param3
demo2=param1#param2#param3
|
-- demo2%myspace2::myapp1=param1#param2#param3
-- demo2%myspace2::myapp2=param1#param2#param3
-- demo2%myspace2::myapp3=param1#param2#param3
列印排序后的陣列不是問題。問題是如何對陣列進行排序,使那些“主”元素出現在“子”元素之前?
PS:我使用 bash 3.2.54,它不支持關聯陣列。
uj5u.com熱心網友回復:
關鍵是從陣列中找出主元素,然后列印每個子元素,排序。
這是一種方法:
#!/bin/bash
myarr=()
myarr =("demo1%myspace1::myapp1=param1#param2#param3")
myarr =("demo1%myspace1::myapp2=param1#param2#param3")
myarr =("demo1%myspace2::myapp1=param1#param2#param3")
myarr =("demo1=param1#param2#param3")
myarr =("demo2%myspace2::myapp1=param1#param2#param3")
myarr =("demo2%myspace2::myapp2=param1#param2#param3")
myarr =("demo2%myspace2::myapp3=param1#param2#param3")
myarr =("demo2=param1#param2#param3")
for i in "${myarr[@]}"
do
# Find main elements
# A main element is something before a =, that does not include a %
firstelement=$(echo "$i" | cut -d'=' -f1)
if [[ ! "$firstelement" =~ % ]]
then
printf '\n%s\n' "$i"
printf ' |\n'
# Print the sub elements related to that main element
printf -- '%s\n' "${myarr[@]}" | grep -E "${firstelement}%.*::" | sort -n | sed -e 's/^/ -- /'
fi
done
我將主元素定義為一個陣列項,其中包含一些文本,后跟=,并且不包含%符號。前任。demo1是主,demo1%myspace1不是。
就是給每個子元素sed添加一個前綴( )。 --
該代碼產生您想要的輸出:
demo1=param1#param2#param3
|
-- demo1%myspace1::myapp1=param1#param2#param3
-- demo1%myspace1::myapp2=param1#param2#param3
-- demo1%myspace2::myapp1=param1#param2#param3
demo2=param1#param2#param3
|
-- demo2%myspace2::myapp1=param1#param2#param3
-- demo2%myspace2::myapp2=param1#param2#param3
-- demo2%myspace2::myapp3=param1#param2#param3
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489010.html
上一篇:如何對包含數字的檔案名進行排序
下一篇:如何按ID對卡片物件進行排序
