如何使用模板与输入文件在对应时间子目录下批量生成参数文件
解决方案
现有脚本已知问题修正
- 变量赋值不能存在空格,
times = $(...)需改为times=$(...) find返回结果默认带./前缀且包含当前目录.,需要额外过滤处理- 原参数提取语句漏写管道符,且
cut对多空白分隔的内容兼容性差,替换为awk更可靠
完整可运行脚本
#!/bin/bash inputfile="input.txt" template="myTemplate.txt" # 提取所有时间目录,过滤当前目录,去除./前缀 times=$(find . -maxdepth 1 -type d | grep -v '^\.$' | sed 's/^\.\///') for eachTime in $times do # 提取input.txt中对应当前时间的行 line=$(sed -n "/^$eachTime\s/p" "$inputfile") # 没有匹配到对应行则跳过 [ -z "$line" ] && continue # 提取各参数 T=$(echo "$line" | awk '{print $2}') P=$(echo "$line" | awk '{print $3}') U=$(echo "$line" | awk '{gsub(/\(/,"",$4); print $4}') V=$(echo "$line" | awk '{print $5}') W=$(echo "$line" | awk '{gsub(/\)/,"",$6); print $6}') # 替换模板占位符,生成对应目录下的output.txt sed -e "s/{%TIME%}/$eachTime/g" \ -e "s/{%T%}/$T/g" \ -e "s/{%P%}/$P/g" \ -e "s/{%U%}/$U/g" \ -e "s/{%V%}/$V/g" \ -e "s/{%W%}/$W/g" \ "$template" > "${eachTime}/output.txt" done
核心逻辑说明
模板填充部分使用sed的字符串替换功能实现,通过多次替换把模板中的占位符依次替换为提取到的参数值,最后将替换后的内容重定向到对应时间目录下的output.txt即可。
如果追求更高效率,还可以把参数提取和模板生成逻辑合并到单条awk命令中实现,避免多次创建子进程,适合处理时间点数量非常大的场景。
内容的提问来源于stack exchange,提问作者Iyach tharwa nambarek
相关产品推荐
相关产品推荐

