首页 > 解决方案 > 文本处理:根据另一列值偏移一列中的日期值

问题描述

我在第 4 列中有日期值为 YYYYMMDD 格式的文本文件,在第 5 列中有月份偏移量。

a1|b1|c1|20190101|1|1|11|A|D
a1|b1|c1|20190101|2|2|12|B|E
a1|b1|c1|20190101|3|3|13|C|F
a2|b2|c2|20190101|1|4|14|G|J
a2|b2|c2|20190101|2|5|15|H|K
a2|b2|c2|20190101|3|6|16|I|L

我想用 date -d '(第 4 列中的值) -(第 5 列中的值) 月 +1 个月' +'%Y%m%d' 的逻辑替换第 5 列中的值

所以最终结果应该如下所示

a1|b1|c1|20190101|20190101|1|11|A|D
a1|b1|c1|20190101|20181201|2|12|B|E
a1|b1|c1|20190101|20181101|3|13|C|F
a2|b2|c2|20190101|20190101|4|14|G|J
a2|b2|c2|20190101|20181201|5|15|H|K
a2|b2|c2|20190101|20181101|6|16|I|L

我使用 awk -f offsetMonths.awk 绑定

BEGIN{
    FS="|"
    OFS = FS
}
{
#   Date field is in column 4, offset is in column 5
#   Replace column 5 with the offset date
    "date -d '"$4" -"$5" months +1 months'  +'%Y%m%d' " | getline l
    $5 = l
    print $0
}

我得到的是

a1|b1|c1|20190101|20190101|1|11|A|D
a1|b1|c1|20190101|20181201|2|12|B|E
a1|b1|c1|20190101|20181101|3|13|C|F
a2|b2|c2|20190101|20181101|4|14|G|J
a2|b2|c2|20190101|20181101|5|15|H|K
a2|b2|c2|20190101|20181101|6|16|I|L

注意第 4 到 6 行中的错误月份偏移值

标签: awk

解决方案


除了 kvantour 答案(这可能比我的更干净,因为我更喜欢使用 awk 内置函数而不是在 awk 中调用 bash 命令),这里是你的代码修复:

BEGIN{
    FS="|"
    OFS = FS
}
{
#   Date field is in column 4, offset is in column 5
#   Replace column 5 with the offset date

    cmd = "date -d '"$4" -"$5-1" months'  +'%Y%m%d'" # as suggested by @kvantour
    cmd | getline result
    close(cmd)
    $5 = result
    print $0
}

结果 :

a1|b1|c1|20190101|20190101|1|11|A|D
a1|b1|c1|20190101|20181201|2|12|B|E
a1|b1|c1|20190101|20181101|3|13|C|F
a2|b2|c2|20190101|20190101|4|14|G|J
a2|b2|c2|20190101|20181201|5|15|H|K
a2|b2|c2|20190101|20181101|6|16|I|L

更多信息在这里。

如果不调用 close(),awk 会创建子进程来运行命令,直到它最终用完更多管道的文件描述符。


推荐阅读