我有:
TEXT='1,2
a,b,c
XX,YY'
我需要這樣的輸出:
OUT='1,a,XX
1,a,YY
1,b,XX
1,b,YY
1,c,XX
1,c,YY
2,a,XX
2,a,YY
2,b,XX
2,b,YY
2,c,XX
2,c,YY'
應該是一些遞回,因為行的長度和行數是未知的。解釋會很好,但只是代碼也可以。
到目前為止我所做的(嘗試使用陣列):
TEXT='1,2
a,b,c
XX,YY'
declare -a lines
COUNT=0
while read LINE; do
lines[$COUNT]=$LINE
COUNT=$((COUNT 1))
done <<<"$TEXT"
declare -A A
K1_MAX=0
K2_MAX=0
for key in "${!lines[@]}"; do
IFS=',' read -ra symbols <<<"${lines[$key]}"
for key2 in "${!symbols[@]}"; do
if [[ $key -gt $K1_MAX ]]; then K1_MAX=$key; fi
if [[ $key2 -gt $K2_MAX ]]; then K2_MAX=$key2; fi
A[$key $key2]=${symbols[$key2]}
done
done
for key in "${!A[@]}"; do
echo $key: "${A[$key]}"
true
done | sort
這給了我輸出:
0 0: 1
0 1: 2
1 0: a
1 1: b
1 2: c
2 0: XX
2 1: YY
但是仍然無法理解如何在它們之間組合這些值。
uj5u.com熱心網友回復:
使用大括號擴展和eval(又名邪惡)的解決方案可能是:
eval printf -v OUT "%s\\\n" {${TEXT//$'\n'/'},{'}}
OUT=${OUT%?} # to strip off the trailing newline character
OUT=${OUT//[\{\}]} # remove '{' and '}' characters, if any
echo "OUT='$OUT'"
或者,出于同樣的原因,使用陣列:
eval arr=({${TEXT//$'\n'/'},{'}})
OUT="${arr[*]}"
OUT=${OUT// /$'\n'}
OUT=${OUT//[\{\}]}
uj5u.com熱心網友回復:
#!/bin/bash
TEXT='1,2
a,b,c
XX,YY'
buildstr(){
local prefix="$1"
if [ -z "$2" ]; then
printf "%s\n" "$prefix"
else
IFS=, read -r -a a <<<"$2"
shift 2
for i in "${a[@]}"; do
buildstr "${prefix: $prefix,}$i" "$@"
done
fi
}
readarray -t a <<<"$TEXT"
OUT=$(buildstr "" "${a[@]}")
declare -p OUT
uj5u.com熱心網友回復:
一個awk使用遞回函式呼叫:
awk '
BEGIN { FS=OFS="," }
{ for (i=1;i<=NF;i ) {
val[NR,i]=$i # val[row#][element#]=elementVal
max[NR]=NF # number of elements in a row
}
}
function print_tuples(row, out, i) {
if (row > NR)
print out
else
for (i=1;i<=max[row];i )
print_tuples(row 1, out (out ? OFS : "") val[row,i])
}
END { print_tuples(1) }
' <<< "${TEXT}"
這會產生:
1,a,XX
1,a,YY
1,b,XX
1,b,YY
1,c,XX
1,c,YY
2,a,XX
2,a,YY
2,b,XX
2,b,YY
2,c,XX
2,c,YY
存盤在bash變數中OUT:
$ OUT=$(awk '... see code above ...')
$ typeset -p OUT
declare -- OUT="1,a,XX
1,a,YY
1,b,XX
1,b,YY
1,c,XX
1,c,YY
2,a,XX
2,a,YY
2,b,XX
2,b,YY
2,c,XX
2,c,YY"
uj5u.com熱心網友回復:
這只是 bash 語法:
echo -e {1,2}","{a..c}","{XX,YY}"\n"
1,a,XX
1,a,YY
1,b,XX
1,b,YY
1,c,XX
1,c,YY
2,a,XX
2,a,YY
2,b,XX
2,b,YY
2,c,XX
2,c,YY
請注意,您不能用變數替換大括號中的值,因為大括號擴展發生在變數替換之前。
.. - 語法只是一個從到到的語法,也適用于 1,2,但它是一個額外的字符。
您也可以使用多位數字、反向運行、前導零和不同于一的步長:
echo -e {9..11}","{c..a}","{099..101..2}"\n"
9,c,099
9,c,101
9,b,099
9,b,101
9,a,099
9,a,101
10,c,099
10,c,101
10,b,099
10,b,101
10,a,099
10,a,101
11,c,099
11,c,101
11,b,099
11,b,101
11,a,099
11,a,101
很強大。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/520097.html
標籤:数组重击递归笛卡尔积
