awk - 文本处理:根据另一列值偏移一列中的日期值
问题描述
我在第 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 行中的错误月份偏移值
解决方案
除了 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 会创建子进程来运行命令,直到它最终用完更多管道的文件描述符。
推荐阅读
- php - php mysql 检查电子邮件是否已经在数据库中
- javascript - 流程:将多个字符串的并集类型转换为新类型
- angular - 让 Angular 在 Cordova 中工作
- excel - 如何测试 Excel VBA 范围变量以引用整列..?
- r - 如何在每个函数都有参数的多个函数中使用 mutate_at?
- amazon-web-services - 不能 SCP 到 AWS EC2
- javascript - JavaScript中的reduce方法
- android - Firebase 的 Unity 身份验证错误
- aws-cloud9 - CLOUD9 - KMS:AWS 访问密钥 ID 需要订阅服务
- mysql - 如何计算多列Mysql中的记录