如何用Bash脚本自动迭代运行模拟并处理ROOT生成的TXT结果?
解决Bash脚本自动化模拟的结果保存与数值读取问题
一、完善模拟结果的保存逻辑
你现有代码已经创建了对应参数的输出目录,但缺少将模拟生成的结果文件移动/复制到该目录的步骤。假设你的$TARGET_SCRIPT运行后会生成固定名称的结果文件(比如sim_output.txt、root_result.txt),可以在创建目录后添加复制/移动命令:
ENERGY_FILE="/my_path/energy_values.txt" # 假设模拟脚本生成的结果文件名为sim_result.txt,根据实际情况修改 RESULT_FILE="sim_result.txt" while IFS= read -r ENERGY do for INPUT in {500..10000..1000} do echo "Executing $TARGET_SCRIPT with Energy: $ENERGY and Input: $INPUT" bash "$TARGET_SCRIPT" "$ENERGY" "$INPUT" dir_name="output_${INPUT}_${ENERGY}" mkdir -p "$dir_name" # 将结果文件移动到对应目录,若要保留原文件用cp代替mv if [ -f "$RESULT_FILE" ]; then mv "$RESULT_FILE" "$dir_name/" echo "Result saved to $dir_name/$RESULT_FILE" else echo "Warning: Result file $RESULT_FILE not found" fi done done < "$ENERGY_FILE"
如果模拟脚本生成多个结果文件,可以用通配符匹配(比如*.txt、*.root),但注意避免误移动其他无关文件:
mv *.txt "$dir_name/"
二、读取ROOT生成的TXT文件数值
ROOT输出的TXT文件通常有两种常见格式,对应不同的读取方式:
1. 键值对格式(比如Mean: 123.45)
如果文件内容类似:
Energy: 1000 Input: 500 Mean Value: 456.78 RMS: 23.45
可以用grep定位目标行,再用awk提取数值:
# 从指定目录的结果文件中读取Mean Value mean_value=$(grep "Mean Value" "$dir_name/$RESULT_FILE" | awk '{print $3}') # 读取RMS rms_value=$(grep "RMS" "$dir_name/$RESULT_FILE" | awk '{print $2}') # 可以将提取的数值保存到汇总文件 echo "$ENERGY $INPUT $mean_value $rms_value" >> simulation_summary.txt
2. 纯数值或固定列格式
如果文件是每行一个数值,或者按列排列的表格:
1000 500 456.78 23.45
直接用awk提取对应列:
# 提取第3列的Mean值,第4列的RMS值 read mean_value rms_value <<< $(awk '{print $3, $4}' "$dir_name/$RESULT_FILE")
3. 复杂格式的处理
如果ROOT输出的是更复杂的格式(比如带表头的表格),可以结合sed先过滤无关行,再用awk提取:
# 跳过前2行表头,提取第3行第2列的数值 target_value=$(sed -n '3p' "$dir_name/$RESULT_FILE" | awk '{print $2}')
三、额外优化建议
- 为避免循环中出现错误导致后续任务中断,可以在运行模拟脚本时添加错误判断:
if bash "$TARGET_SCRIPT" "$ENERGY" "$INPUT"; then # 模拟成功才执行结果保存 mkdir -p "$dir_name" mv "$RESULT_FILE" "$dir_name/" else echo "Error: $TARGET_SCRIPT failed with Energy: $ENERGY, Input: $INPUT" >> error_log.txt fi
- 如果
$TARGET_SCRIPT运行时间较长,可以添加后台运行(但要注意资源占用),或者用parallel工具并行处理,提升效率。
内容的提问来源于stack exchange,提问作者user13623042
相关产品推荐
相关产品推荐

