在awk脚本中嵌套执行awk命令报错,寻求解决方案
解决awk脚本嵌套执行awk的引号问题&优化方案
首先得说,你现在的脚本有几个关键问题,直接导致了报错:
1. 脚本解释器配置错误
你的脚本开头写的是#!/bin/bash,但你用awk -f去执行它,这本身就矛盾了——awk脚本的正确解释器应该是#!/usr/bin/awk -f,这样系统才能正确用awk解析脚本内容。
2. 完全不需要嵌套awk!
你的需求是把EfectiveDate替换成Effective Date,这个操作在当前awk进程里直接就能完成,根本没必要再启动一个子awk进程,既浪费资源又容易引发引号冲突。
正确的脚本写法(Lab4_1.awk)
#!/usr/bin/awk -f BEGIN { FS = "," } { # 对当前行内容执行替换 gsub(/EfectiveDate/, "Effective Date") # 输出处理后的行 print $0 }
执行命令还是你原来的:
awk -f lab4_1.awk sample_enrollment.csv
或者给脚本加执行权限后直接运行:
chmod +x Lab4_1.awk ./Lab4_1.awk sample_enrollment.csv
如果非要尝试嵌套awk(不推荐)
如果你只是想验证嵌套写法的可行性,问题核心在于单引号的转义——外层awk的执行上下文里,内层awk的单引号需要特殊处理。不过这种写法既繁琐又低效,这里仅做演示:
#!/usr/bin/awk -f BEGIN { FS = "," } { # 用system调用执行子awk,注意单引号转义为'\'' cmd = "echo \"" $0 "\" | awk '\''gsub(/EfectiveDate/, \"Effective Date\"); print'\''" system(cmd) }
内容的提问来源于stack exchange,提问作者Ububtunoob
相关产品推荐
相关产品推荐

