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

awk脚本替换列内日期时如何保留原有固定列间距保持对齐

固定列宽文本日期替换awk修正脚本

适用场景

  • 运行环境:Windows XP设备上MKS Toolkit提供的Korn Shell,适配awk 9.2.3.2096老旧版本
  • 处理文件规则:严格固定列宽txt格式,每行开头带1个空格,行首到第二列起始位置总长度为20字符,第二列与第三列之间固定间隔4个空格,第一列内容长度不固定
  • 功能逻辑:通过awk -v参数接收外部Shell传入的目标日期变量broken_date,自动比对第二列、第三列的前缀值,当前缀不匹配时替换第二列末尾的6位日期字段,其余内容、格式完全保留,不会出现列错位。

原有脚本问题

原脚本通过手动拼接固定数量空格实现列分隔,第一列长度变化时会导致输出列错位,无法保留原文件的严格列间距要求。

修正后脚本代码

{
    c2 = $2
    c3 = $3
    sub(/^0+/, "", c2)
    sub(/^0+/, "", c3)
    sub(/-.*$/, "", c3)

    if (length(c2) == 8) {
        c2_value = substr(c2, 1, 2)
    } else if (length(c2) == 9) {
        c2_value = substr(c2, 1, 3)
    }

    if (length(c3) == 10) {
        c3_value = substr(c3, 1, 2)
    } else if (length(c3) == 11) {
        c3_value = substr(c3, 1, 3)
    }

    if (c2_value != c3_value) {
        # 按字符位置截取原行内容,仅替换第二列最后6位日期,其余字符原封不动保留
        date_start_pos = 20 + length($2) - 5
        $0 = substr($0, 1, date_start_pos - 1) broken_date substr($0, date_start_pos + 6)
    }

    print $0
}

调用方式

在Korn Shell中执行以下命令即可,将220909替换为实际需要写入的6位日期值:

awk -v broken_date="220909" -f 脚本文件路径.awk 待处理文件路径.txt > 输出结果文件路径.txt

效果说明

  • 全程操作原行字符串按位置替换,不需要手动拼接列间空格,所有原有空格、非日期字段的位置完全不变,列对齐精度和原文件完全一致
  • 没有使用高版本awk特性,完全兼容MKS Toolkit自带的老旧awk版本
  • 无论第一列长度如何变化,都不会出现列错位问题

内容的提问来源于stack exchange,提问作者fletching

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:48:34