如何用Awk匹配指定行后替换内容并生成多份对应输出文件?
需求与问题
需要完成以下操作:
- 在主文件中匹配含“menu”的行,定位到该行向下2行的位置
- 将主文件中对应行的内容替换为参考文件里的字符串
- 每个参考项对应生成一个独立输出文件,文件名与参考项名称一致
示例文件
主文件(main)
This week's menu: Main dish: xxx Side: yyy
(注:原示例中的[main]标记可忽略,实际处理核心内容)
参考文件(ref)
Day1 Chicken Salad Day2 Beef Yogurt Day3 Pork Fruit
(原示例中的[ref]标记可忽略)
预期输出
- Day1文件内容:
This week's menu: Main dish: Chicken Side: Salad
- Day2文件内容:
This week's menu: Main dish: Beef Side: Yogurt
- 以此类推生成Day3等文件
当前错误代码
我编写的Awk代码无法正常执行,代码如下:
awk -v fname=$1 dish=$2 side=$3 '/menu/ {getline}{$3=dish} {getline;getline;}{$2=side}1' main ref > fname
修正后的Awk代码
# 读取主文件内容并存储,记录menu行位置 NR == FNR { main_lines[++main_cnt] = $0 if ($0 ~ /menu/) { menu_line = NR } next } # 处理参考文件有效行(跳过空行和[ref]标记) $0 !~ /^\[ref\]$/ && NF >=3 { fname = $1 dish = $2 side = $3 # 遍历主文件内容,替换对应行并写入文件 for (i=1; i<=main_cnt; i++) { line = main_lines[i] if (i == menu_line + 1) { sub(/xxx/, dish, line) } else if (i == menu_line + 2) { sub(/yyy/, side, line) } print line > fname } close(fname) }
使用方法
将上述修正代码保存为fix.awk,在终端执行:
awk -f fix.awk main ref
代码说明
- 先读取主文件所有内容到数组,同时记录含“menu”的行号,方便后续定位目标行
- 处理参考文件时,每行提取文件名、主菜、配菜信息
- 遍历主文件内容,对
menu行+1(Main dish行)和menu行+2(Side行)分别替换内容 - 每个参考项对应生成独立文件,完成后关闭文件句柄避免资源泄漏
内容的提问来源于stack exchange,提问作者EverLearner
相关产品推荐
相关产品推荐

