如何在Shell脚本中用AWK批量插入匹配的NAME值到对应行?
解决文本块中插入NAME值的Shell脚本方案
问题描述
我有一个结构固定的文本文件,内容按NAME块重复排列,每个块包含NAME、TYPE、TEST和END行,冒号后的内容各不相同。希望生成新文件,将每个块的NAME值插入到该块内TYPE和TEST行的开头。
原文件示例
NAME : Name1 TYPE : Something2 TEST : Something3 END NAME : Name2 TYPE : Something5 TEST : Something6 END
期望输出示例
NAME : Name1 Name1 TYPE : Something2 Name1 TEST : Something3 END NAME : Name2 Name2 TYPE : Something5 Name2 TEST : Something6 END
已尝试的命令
awk '/NAME/ {print;while($0!~ /END/){getline;print;}}' InputFile > OutputFile
解决方案
用awk就能实现需求,核心逻辑是先把每个块的NAME值存起来,后续遇到TYPE/TEST行时把这个值加在开头:
awk '/NAME :/ {name=$3; print; next} /TYPE :|TEST :/ {print name " " $0; next} 1' InputFile > OutputFile
代码说明
- 碰到
NAME :开头的行时,提取冒号后的名称(第3个字段)存到变量name,打印当前行后直接处理下一行 - 碰到
TYPE :或TEST :开头的行时,把之前存的name加空格拼在当前行前面再打印 - 最后的
1是awk的简写规则,对所有没被上面规则匹配到的行(比如END行)直接原样输出
内容的提问来源于stack exchange,提问作者UkTerry
相关产品推荐
相关产品推荐

