我的bash脚本中有两个数组:
A=('AB' 'CD' 'EF' 'GH' 'IJ' 'KL' 'MN');
B=('1' '2' '3' '4' '5' '6' '7');
我希望能够将数组合并到变量中(例如,在' merge'中),以便执行如下操作:
echo $merge
...会打印
(AB, 1, CD, 2, EF, 3, GH, 4, IJ, 5, KL, 6, MN, 7)
数组的长度/大小不必相等。有关如何做到这一点的任何想法?
谢谢!
答案 0 :(得分:2)
A=('AB' 'CD' 'EF' 'GH' 'IJ' 'KL' 'MN')
B=('1' '2' '3' '4' '5' '6' '7' '8')
len=${#A[@]}
[[ $len -lt ${#B[@]} ]] && len=${#B[@]}
out=""
for i in $(seq 0 $((len-1)));do
[[ -n "${A[$i]}" ]] && out=$out","${A[$i]}
[[ -n "${B[$i]}" ]] && out=$out","${B[$i]}
done
echo ${out:1}
注意:我给出B 8元素,这样如果A和B的长度不相同,只需将较长列表的其余元素放到输出尾部
说明:
3行和4行代码只找出两个list的最大长度。然后使用for循环将每个列表的i
非空项放入输出中。最后删除第一个seprator { {1}}。
希望这会对你有所帮助。
答案 1 :(得分:1)
我会接近,但略有不同。选择最短的数组不是找到最长的数组,而是确保每个数组中包含1对1元素的唯一方法:
#!/bin/bash
A=('AB' 'CD' 'EF' 'GH' 'IJ' 'KL' 'MN')
B=('1' '2' '3' '4' '5' '6' '7' '8')
len=${#A[@]}
declare -a combined
[ $len -lt ${#B[@]} ] || len=${#B[@]} # find shortest array
for ((i = 0; i < $len; i++)); do
[ -n ${A[i]} ] && combined+=( "${A[i]}" )
[ -n ${B[i]} ] && combined+=( "${B[i]}" )
done
merge=$(printf " %s," ${combined[@]})
merge=${merge%,}
merge="($merge)"
echo $merge
exit 0
<强>输出强>
$ bash array_merge.sh
(AB, 1, CD, 2, EF, 3, GH, 4, IJ, 5, KL, 6, MN, 7)
答案 2 :(得分:0)
A=('AB' 'CD' 'EF')
B=('1' '2' '3' '4' '5' '6' '7' '8')
IFS=$'\n'
m=($(paste -d\\n <(printf %s,\\n "${A[@]}") \
<(printf %s,\\n "${B[@]}" | head -c-2)))
merge=\("${m[@]}"\)
echo "$merge"
输出:
(AB, 1, CD, 2, EF, 3, 4, 5, 6, 7, 8)