在数组中重复元素n次

时间:2015-03-23 07:38:43

标签: bash

基本上,我试图重复以下数组[1 2 3]中的每个元素4次,这样我就会得到这样的结果: [1 1 1 1 2 2 2 2 3 3 3 3]

我尝试了一段非常愚蠢的代码,即abc=('1%.0s' {1..4})。但它失败了。

我正在寻找一个有效的一线解决方案来解决这个问题,最好不要使用循环。如果只用一行就不可能实现这一点,那么使用循环。

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

与您想要的相似。