如何通过Shell命令提取文件内多类型数值并存入变量
问题说明
现有如下格式的配置文件:
water { nu 1.69e-3; rho 8; } vapour { rho 2; } right { type zeroGradient 6; value uniform (40 10 0); } left { value uniform (0 5 0); }
需要从文件中提取1.69e-3、8、2、40、5五个值存入独立变量。目前已实现两个rho值的提取,对应变量rhol(值8)、rhog(值2),使用的命令如下:
rhol=`grep rho file | awk '{print $NF}' | sed -e 's/;//g' | head -1` rhog=`grep -m2 rho file | awk '{print $NF}' | sed -e 's/;//g' | tail -n1`
当前遇到的问题是无法正确提取科学计数法格式的nu参数值1.69e-3,以及right、left配置块中value字段对应的40、5两个值,需要可落地的实现方案。
实现方案
原有提取rho的逻辑存在隐患:如果文件后续新增其他带rho的配置项,会出现匹配错位。更稳妥的方式是用awk的区间匹配能力,先锁定对应配置块的范围,再在块内提取目标字段,完全避免跨块匹配错误,同时兼容科学计数法、带括号/分号的特殊行格式。
各字段提取命令
- 提取nu参数值(1.69e-3):锁定water配置块,匹配nu字段后删除行尾分号取值
nu_val=$(awk '/^water$/,/^}/{if(/nu/){gsub(";","");print $NF}}' 你的文件路径)
- 提取right块value的第一个值(40):锁定right配置块,匹配value行后删除括号、分号特殊字符,取uniform后的第一个数值
right_val=$(awk '/^right$/,/^}/{if(/value/){gsub(/[;()]/,"");print $3}}' 你的文件路径)
- 提取left块value的第二个值(5):锁定left配置块,匹配value行后删除特殊字符,取对应位置的数值
left_val=$(awk '/^left$/,/^}/{if(/value/){gsub(/[;()]/,"");print $4}}' 你的文件路径)
完整提取脚本
可以把所有变量的提取统一替换为区间匹配逻辑,稳定性更高:
# 替换为实际文件路径 target_file="./test.txt" # 提取water块nu值 nu_val=$(awk '/^water$/,/^}/{if(/nu/){gsub(";","");print $NF}}' "$target_file") # 提取water块rho值(替换原有rhol提取逻辑) rhol=$(awk '/^water$/,/^}/{if(/rho/){gsub(";","");print $NF}}' "$target_file") # 提取vapour块rho值(替换原有rhog提取逻辑) rhog=$(awk '/^vapour$/,/^}/{if(/rho/){gsub(";","");print $NF}}' "$target_file") # 提取right块value第一个值 right_val=$(awk '/^right$/,/^}/{if(/value/){gsub(/[;()]/,"");print $3}}' "$target_file") # 提取left块value第二个值 left_val=$(awk '/^left$/,/^}/{if(/value/){gsub(/[;()]/,"");print $4}}' "$target_file") # 打印结果验证 echo "nu: $nu_val" echo "rhol: $rhol" echo "rhog: $rhog" echo "right_value: $right_val" echo "left_value: $left_val"
执行后输出结果为:
nu: 1.69e-3 rhol: 8 rhog: 2 right_value: 40 left_value: 5
问题原因说明
之前提取失败的核心原因有两个:
- 提取nu时如果用全局grep匹配,没有限定在water块内,且没有处理可能存在的字段误匹配问题,实际上awk对科学计数法格式的字符串可以正常读取,不存在格式兼容问题
- 提取value字段时全局匹配会同时拿到right和left两个块的value行,且行内包含括号、分号特殊字符,直接取最后一个字段会拿到带符号的错误内容,也无法区分值属于哪个配置块
内容的提问来源于stack exchange,提问作者Ayn
相关产品推荐
相关产品推荐

