你如何在n组中打破一个数组

时间:2014-05-19 21:36:13

标签: arrays bash

这类似于Add '\n' after a specific number of delimiters,但是,如果组中的元素是可编程的,则假设数字。

我们有:

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 个答案:

答案 0 :(得分:10)

使用子字符串扩展。从"${array[@]:offset:length}"开始,length会从offset获取#!/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}}

答案 1 :(得分:2)

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

答案 2 :(得分: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'