基本上,我试图重复以下数组[1 2 3]
中的每个元素4次,这样我就会得到这样的结果:
[1 1 1 1 2 2 2 2 3 3 3 3]
我尝试了一段非常愚蠢的代码,即abc=('1%.0s' {1..4})
。但它失败了。
我正在寻找一个有效的一线解决方案来解决这个问题,最好不要使用循环。如果只用一行就不可能实现这一点,那么使用循环。
答案 0 :(得分:1)
除非你试图避免循环,否则你可以这样做:
arr=(1 2 3)
for i in ${arr[@]}; do for ((n=1; n<=4; n++)) do echo -n "$i ";done; done; echo
1 1 1 1 2 2 2 2 3 3 3 3
将结果存储在数组中:
aarr=($(for i in ${arr[@]}; do for ((n=1; n<=4; n++)) do echo -n "$i ";done; done;))
declare -p aarr
declare -a aarr='([0]="1" [1]="1" [2]="1" [3]="1" [4]="2" [5]="2" [6]="2" [7]="2" [8]="3" [9]="3" [10]="3" [11]="3")'
答案 1 :(得分:1)
这可以满足您的需求并将其存储在数组中:
declare -a res=($(for v in 1 2 3; do for i in {1..4}; do echo $v; done; done))
答案 2 :(得分:1)
将您的想法带到下一步:
$ a=(1 2 3)
$ b=($(for x in "${a[@]}"; do printf "$x%.0s " {1..4}; done))
$ echo ${b[@]}
1 1 1 1 2 2 2 2 3 3 3 3
或者,使用sed:
$ echo ${a[*]} | sed -r 's/[[:alnum:]]+/& & & &/g'
1 1 1 1 2 2 2 2 3 3 3 3
或者,使用awk:
$ echo ${a[*]} | awk -v RS='[ \n]' '{for (i=1;i<=4;i++)printf "%s ", $0;} END{print""}'
1 1 1 1 2 2 2 2 3 3 3 3
答案 3 :(得分:1)
简单的一个班轮:
for x in 1 2 3 ; do array+="$(printf "%1.0s$x" {1..4})" ;done
与您想要的相似。