如何使用AWK提取含指定字符串行的下一行第三列值并批量导出到文件
问题原因与调整方案
你当前脚本存在两个核心问题:
- 变量赋值错误:
num=$SLURM_ARRAY_TASK_ID..末尾多了两个多余的点,会导致后续文件夹名匹配错误,无法进入正确的目标目录 - 若你需要汇总所有结果到同一个文件,并行数组任务直接写入同一路径会触发覆盖问题
以下分两种常见使用场景给出调整方案:
场景1:每个文件的提取结果单独保存在对应surf_xxx目录下
调整后的任务脚本如下:
#SBATCH --array=1-100 # 此处替换为你自己的上级目录实际路径 export main_path="/你的上级目录绝对路径" num=$SLURM_ARRAY_TASK_ID fold=$(printf '%03d' $num) # 进入目录失败则直接退出,避免在错误路径执行命令 cd "${main_path}/surf_${fold}" || exit 1 # awk逻辑本身符合需求:匹配到Energy行后做标记,下一行打印第三列后重置标记,稳定性优于getline写法 awk 'f{print $3; f=0} /Energy/{f=1}' inputfile > outputfile
场景2:所有100个文件的提取结果汇总到同一个总输出文件
可通过先输出到带唯一标识的临时文件、跑完后合并的方式避免覆盖:
步骤1:调整数组任务脚本,输出文件带上目录标识
#SBATCH --array=1-100 export main_path="/你的上级目录绝对路径" num=$SLURM_ARRAY_TASK_ID fold=$(printf '%03d' $num) cd "${main_path}/surf_${fold}" || exit 1 awk 'f{print $3; f=0} /Energy/{f=1}' inputfile > "${main_path}/tmp_result_${fold}.txt"
步骤2:所有任务跑完后执行合并命令
cat ${main_path}/tmp_result_*.txt > total_result.txt # 可选:合并后删除临时文件 rm ${main_path}/tmp_result_*.txt
内容的提问来源于stack exchange,提问作者Xdrake
相关产品推荐
相关产品推荐

