在bash中,将变量拆分为一个数组,每个数组值包含列表中的n个值

在bash中,将变量拆分为一个数组,每个数组值包含列表中的n个值,bash,Bash,所以我向mysql发出一个查询,它返回1000行,但是程序的每次迭代都可能返回不同数量的行。我需要将这个结果集分解(不使用mysql限制)成100行的块,然后我可以通过编程在这100行块中进行迭代 所以 我需要把它转换成一个数组 array[1]="1 2 3 ... 100" array[2]="101 102 103 ... 200" 等等 我不知道如何优雅地完成这件事 # generate content MySQLOutput=$(seq 1 10000 | tr '\n' ' ')

所以我向mysql发出一个查询,它返回1000行,但是程序的每次迭代都可能返回不同数量的行。我需要将这个结果集分解(不使用mysql限制)成100行的块,然后我可以通过编程在这100行块中进行迭代

所以

我需要把它转换成一个数组

array[1]="1 2 3 ... 100"
array[2]="101 102 103 ... 200"
等等

我不知道如何优雅地完成这件事

# generate content
MySQLOutput=$(seq 1 10000 | tr '\n' ' ') # seq is awful, don't use in real life

# split into a large array, each item stored individually
read -r -a MySQLoutArr <<<"$MySQLOutput"

# add each batch of 100 items into a new array entry
batchSize=100
MySQLoutSplit=( )
for ((i=0; i<${#MySQLoutArr[@]}; i+=batchSize)); do
  MySQLoutSplit+=( "${MySQLoutArr[*]:i:batchSize}" )
done
#生成内容
MySQLOutput=$(seq 1 10000 | tr'\n'')#seq很糟糕,不要在现实生活中使用
#分割成一个大数组,每个项目单独存储

使用Charles的数据生成读取-r-a MySQLoutArr:

MySQLOutput=$(seq 1 10000 | tr '\n' ' ')

# the sed command will add a newline after every 100 words
# and the mapfile command will read the lines into an array
mapfile -t MySQLOutSplit < <(
    sed -r 's/([^[:blank:]]+ ){100}/&\n/g; $s/\n$//' <<< "$MySQLOutput"
)

echo "${#MySQLOutSplit[@]}"
# 100

echo "${MySQLOutSplit[0]}"
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 

echo "${MySQLOutSplit[99]}"
# 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 
MySQLOutput=$(seq 1 10000 | tr'\n'')
#sed命令将在每100个单词后添加一个换行符
#mapfile命令将把这些行读入数组
映射文件-t MySQLOutSplit<
MySQLOutput=$(seq 1 10000 | tr '\n' ' ')

# the sed command will add a newline after every 100 words
# and the mapfile command will read the lines into an array
mapfile -t MySQLOutSplit < <(
    sed -r 's/([^[:blank:]]+ ){100}/&\n/g; $s/\n$//' <<< "$MySQLOutput"
)

echo "${#MySQLOutSplit[@]}"
# 100

echo "${MySQLOutSplit[0]}"
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 

echo "${MySQLOutSplit[99]}"
# 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000