使用Awk为空白列填充MMYYYY格式日期的问题求助
解决Awk填充竖线分隔文件空第一列为MMYYYY日期的问题
嘿,我来帮你搞定这个问题!你之前试的三段Awk代码都没生效,咱们先拆解下为啥不行,再给你靠谱的解决方案~
为啥你的三段代码都失效了?
- 代码1:
if ($1=="") {$1="date +%m%Y"}
这段代码只是把$1赋值成了字符串"date +%m%Y",Awk不会自动执行这个系统命令,所以最终填充的是命令文本,不是实际日期。 - 代码2:
if ($1=="") {$1=date +%m%Y}
反引号执行系统命令是Shell的语法,Awk不支持这种写法,所以这段代码要么报错,要么完全不生效。 - 代码3:
if ($1=="") {$1=("Time = %m%Y", systime());}
这里语法完全错误:systime()返回的是Unix时间戳,要转成MMYYYY格式得用Awk内置的strftime()函数,而且你括号里的写法不符合Awk的语法规则。
正确的解决方案
因为你的文件是竖线分隔的,首先要告诉Awk用竖线作为字段分隔符(FS)和输出字段分隔符(OFS),这样修改字段后输出还能保持竖线分隔的格式。
方案1:用Awk内置strftime(推荐,无需调用外部命令)
这是最简洁高效的方式,绝大多数现代Awk版本(比如Gawk)都支持strftime函数:
BEGIN { FS = "|" OFS = "|" # 提前生成MMYYYY格式的当前日期,避免每行重复计算 current_date = strftime("%m%Y") } # 当第一列为空时填充日期 $1 == "" { $1 = current_date } # 打印处理后的每一行 1
使用方式:假设你的输入文件是input.txt,执行命令:
awk -f fill_date.awk input.txt > output.txt
方案2:兼容老版本Awk(调用Shell的date命令)
如果你的Awk版本太老不支持strftime,可以通过管道调用Shell的date命令获取日期:
BEGIN { FS = "|" OFS = "|" # 执行date命令并读取结果到变量 "date +%m%Y" | getline current_date # 关闭管道避免资源泄漏 close("date +%m%Y") } $1 == "" { $1 = current_date } 1
测试示例
假设你的输入行是:
|SourleName|GntCode|Dision|Suvision|ProfitCe1|Profie2|Plade|Retuiod|SuppliN SAP|SAP_OSR_INV||||||||08AAACT2T|
处理后会输出:
042024|SourleName|GntCode|Dision|Suvision|ProfitCe1|Profie2|Plade|Retuiod|SuppliN SAP|SAP_OSR_INV||||||||08AAACT2T|
(注:042024是当前月份和年份,会根据实际日期自动变化)
内容的提问来源于stack exchange,提问作者as7951
相关产品推荐
相关产品推荐

