bash read -ra处理长字符串时丢失数组末尾元素
Bash脚本处理长字符串转数组时末尾元素丢失问题
我用bash脚本的read -ra命令将长分隔字符串转换为数组,小长度字符串处理正常,但处理含6561个元素(135726字符)的字符串时,数组末尾元素丢失。
我的需求是将ExodusII格式的ASCII文件转换为gnuplot可用的xyz格式,输入文件格式如下:
coordx = 1, 1.0125, 1.0125, 1, 1.00625, 1.0125, 1.00625, 1, 1.00625, 1.025, 1.025, 1.01875, 1.025, 1.01875, 1.01875, 1.0375, 1.0375, 1.03125, 1.0375, [snip] 1.46875, 1.4875, 1.4875, 1.48125, 1.48125, 1.5, 1.5, 1.49375, 1.49375 ; coordy = 1, 1, 1.0125, 1.0125, 1, 1.00625, 1.0125, 1.00625, 1.00625, 1, 1.0125, 1, 1.00625, 1.0125, 1.00625, 1, 1.0125, 1, 1.00625, 1.0125, [snip] 1.49375, 1.5, 1.49375, 1.5, 1.49375, 1.5, 1.49375, 1.5, 1.49375 ; vals_nod_var1 = 1.50711777303835e-07, 4.54731383295358e-07, 1.4039653539437e-06, 4.54743954548528e-07, 3.02721580299597e-07, 9.29348368619529e-07, [snip] -1.08946977710559e-10, -1.40259016278983e-10 ;
计划将每个列表读取到单独数组(coordx[$i]、coordy[$i]、values[$i]),输出格式为:
coordx[1] coordy[1] vals[1] coordx[2] coordy[2] vals[2]
脚本中出现问题的部分如下:
str_vals=$(sed -n "$startline_v,$endline_v p" "$file" | xargs) IFS=', ' read -ra vals <<< "$str_vals" str_coordx=$(sed -n "$startline_x,$endline_x p" "$file" | xargs) IFS=', ' read -ra coordx <<< "$str_coordx" str_coordy=$(sed -n "$startline_y,$endline_y p" "$file" | xargs) IFS=', ' read -ra coordy <<< "$str_coordy"
sed命令可正确将列表转为, 分隔的字符串,用wc -w验证长度正确(会读取到coordx、=、;等无用元素,打印时会丢弃)。
处理441元素的输入文件时脚本正常,但处理6561元素的数据集时,coordx和coordy数组正常,而${#vals[@]}仅为6355,vals[6354]之后的元素为空。
未发现输入文件对应位置有特殊字符终止read命令,仅vals字符串字符数更多。排查ARG_MAX(本机为6291456),str_vals仅135726字符,未超出限制。系统为Kubuntu 22.04,寻求解决建议。
内容的提问来源于stack exchange,提问作者Andrew L Cooksy
相关产品推荐
相关产品推荐

