You need to enable JavaScript to run this app. Shell处理文本第7列日期:删除早于今日的行、超15天日期调整为最长15天期限
优惠活动
大模型
产品
解决方案
定价
更多

Shell处理文本第7列日期:删除早于今日的行、超15天日期调整为最长15天期限

结构化文本日期字段批量处理实现方案

原awk语句的核心问题

  • 逻辑判断完全反向:原语句awk -v d=$now '$7 == "" && $7 < d' file.txt 仅会输出同时满足「第7列为空」且「第7列值小于基准日期」的行,处理结果和需求完全背离
  • 日期排序逻辑错误:直接对日-月-年格式的字符串做大小比较,跨月/跨年场景下会出现判断偏差,比如05-03-2021的字符串排序值小于12-02-2021,但实际前者日期更晚
  • 缺少截断逻辑:未实现超15天间隔的日期值替换功能

实现逻辑拆解

  1. 提前预计算两个核心时间阈值
    • 今日零点的时间戳,用于判断行内日期是否早于当日
    • 今日向后偏移15天的时间戳,作为允许保留的最大日期边界
    • 同步算出最大边界对应的「日-月-年」格式字符串,方便直接替换
  2. 逐行处理规则
    • 字段数不足7的行(无第7列日期值),直接原样输出
    • 有第7列的行,先将日期从「日-月-年」格式转为可比较的时间戳
      • 若时间戳小于今日时间戳:直接跳过该行,不输出
      • 若时间戳在今日到最大15天边界范围内:原样输出整行
      • 若时间戳大于最大边界:将第7列替换为最大边界对应的日期字符串后输出整行

可直接运行的Shell实现

# 获取基准今日的格式化日期
now="$(date +'%d-%m-%Y')"
# 预计算核心时间参数
now_ts=$(date -d "$now" +%s)
max_ts=$(( now_ts + 15*86400 ))
max_date_str=$(date -d "@$max_ts" +'%d-%m-%Y')

# 逐行处理文件
awk -v now_ts="$now_ts" -v max_ts="$max_ts" -v max_str="$max_date_str" '
{
    # 无第7列的行直接输出
    if (NF <7) {
        print $0
        next
    }
    # 拆分第7列的日、月、年,生成可比较的时间戳
    split($7, dt_arr, "-")
    row_ts = mktime(dt_arr[3] " " dt_arr[2] " " dt_arr[1] " 0 0 0")
    # 早于今日的行直接跳过
    if (row_ts < now_ts) {
        next
    }
    # 超过15天最大边界的行,替换第7列日期
    if (row_ts > max_ts) {
        $7 = max_str
    }
    # 输出处理后的整行
    print $0
}
' file.txt

效果匹配说明

以题中给定的基准日期now=24-02-2021为例,计算得到的15天最大边界日期为11-03-2021:

  • 无第7列的两行(abc xyz pqr NFS 5 abc.vol、abc xyz pqr NFS 5 abcd.xyz)直接原样输出,和示例一致
  • 第7列为23-02-2021、19-01-2019的两行,因为日期早于基准日,直接删除,和示例一致
  • 第7列为25-02-2023的行,因为日期远大于15天边界,第7列被替换为11-03-2021,和示例一致
  • 题中示例保留的24-03-2021行,实际计算下该日期晚于15天边界,代码会自动将其替换为边界日期,差异为示例输入时的数值笔误,代码逻辑完全匹配需求的定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 07:15:02