如何将一个数组分成n组?

11

这与在特定分隔符后添加'\n'类似,但假设组中的元素数量是可编程的。

我们有:

aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm
g=4

我们想要

aaa,bbb,ccc,ddd
eee,fff,ggg,hhh
iii,jjj,kkk,lll
mmm

我们如何使用 bash 完成这个任务?

我尝试了许多选项。这是最新的失败尝试(tmp[] 是数组):

for e in ${tmp[@]}; do 
  for i in $(eval echo "{0..$groupsof}"); do 
    foo[$i]=$e; 
  done
done
3个回答

21

使用子字符串展开。 "${array[@]:offset:length}" 可以获取从 offset 开始的 length 个元素:

#!/bin/bash

array=(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm)
g=4

for((i=0; i < ${#array[@]}; i+=g))
do
  part=( "${array[@]:i:g}" )
  echo "Elements in this group: ${part[*]}"
done

+1:虽然您可能希望在循环内添加 IFS=, 以匹配输出。 - jaypal singh

3
kent$  array=(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm)

kent$  echo "${array[@]}"|xargs -n4                               
aaa bbb ccc ddd
eee fff ggg hhh
iii jjj kkk lll
mmm

0

这个有效:

echo aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm | sed 's/,/,\n/g' | paste -d "" $(yes - | head -4 | paste -s) | sed 's/,$//g'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接