AWK结合sed处理作业配置文件:添加condition行语法问题求助
解决方法
首先,你之前的命令出现语法错误是因为在awk中通过管道调用sed的方式不正确,而且逻辑上也没匹配到需要修改的行。其实完全可以用awk单独完成修改,不需要嵌套sed,这样更简洁可靠。
针对你当前已完成第一步的情况(文件中每两行一组,第一行是原始行,第二行是复制的行)
运行下面的awk命令即可完成第二步修改:
awk 'NR%2 == 1 { print; next } { sub(/insert_job:/, "condition:"); sub(/18132_TAL_/, "18132_"); print }' input.dat
命令解释:
NR%2 == 1:匹配奇数行(也就是你的原始作业行),直接打印后用next跳过后续处理- 对于偶数行(复制出来的行):
sub(/insert_job:/, "condition:"):把行首的insert_job:替换成condition:sub(/18132_TAL_/, "18132_"):把作业名中的18132_TAL_替换成18132_- 最后打印修改后的行
更高效的一步到位方案(从原始文件直接生成最终结果)
其实没必要分两步操作,直接用awk就能从原始文件同时完成复制和修改:
awk '{ # 先打印原始行 print; # 复制一行并修改 modified_line = $0; sub(/insert_job:/, "condition:", modified_line); sub(/18132_TAL_/, "18132_", modified_line); # 打印修改后的行 print modified_line }' input.dat
这个命令会读取原始文件的每一行,先输出原始行,再输出修改后的condition行,一步完成你需要的所有操作,避免中间步骤出错。
为什么你之前的命令失败?
你的命令cat input.dat | awk '($0!~"job_type") {print $0|sed "s/insert_job/condition/"} 1'有两个问题:
$0!~"job_type":你的原始行和复制行都包含job_type,所以这个条件永远不会触发,sed根本没被调用到- 在awk中通过
print | sed的方式调用外部命令需要注意语法和缓冲区问题,这种场景下完全没必要用sed,awk自身的字符串替换功能足够处理
内容的提问来源于stack exchange,提问作者Platinum
相关产品推荐
相关产品推荐

