You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:39:07