妙用awk

发布时间 2023-09-22 13:52:41作者: 与时代共同进步

需求 采集到的数据入库前需要加上一个入库日期时间字段
storage_time YYYY-MM-DD HH:MM:SS 例如:2023-09-22 13:40:00

下面是在chatgpt配合下我进行的尝试

第一次尝试失败

源数据

20230820\t南京 5664
20230820 徐州 1340
20230820 淮安 463
20230820 扬州 868
20230820 泰州 704
20230820 南通 1350
20230820 镇江 652
20230820 苏州 5473
20230820 连云港 1121
20230820 宿迁 378

原数据截图

awk '{print $0, "2023-09-22 10:00:00"}' stg_d_bp_daping_intl_roam_out_hprov_20230921.txt > oh.txt
处理后数据截图

处理后我尝试将数据入库,结果失败了

开始排查问题

开始排查问题
awk '{print $NF}' stg_d_bp_daping_intl_roam_out_hprov_20230921.txt

发现我加的时间戳 "2023-09-22 10:00:00" 被识别成两列数据了
awk '{for (i=1; i<NF; i++) printf "%s ", $i; print ""}' stg_d_bp_daping_intl_roam_out_hprov_20230921.txt >> o_hp.txt

将时分秒舍弃,只留年月日数据
再次尝试将数据入库,发现还是失败

继续排查问题,成功将数据入库

继续排查问题
发现是因为这样处理后列于列之间的间隔符变成了空格,而非制表符,不能满足入库脚本的调度
awk -F' ' 'BEGIN {OFS="\t"} {$1=$1; print}' stg_d_bp_daping_intl_roam_out_hprov_20230921.txt >> test1.txt

ok,再次尝试执行入库脚本,success

简化awk命令代码

尝试简化代码,来完成剩下数据表的入库
直接加一列年月日数据
awk '{print $0, "2023-09-22"}' stg_d_bp_daping_intl_roam_out_hcity_20230921.txt > ohc.txt

发现最后一列与前面的列之间的分隔符是空格

继续优化

继续优化
awk -v OFS="\t" '{$(NF+1)="2023-09-22"; print}' stg_d_bp_daping_intl_roam_out_hcity_20230921.txt > ohc21.txt

思考

第一次舍弃时分秒,是因为没有指定输出结果的分隔符,如果我指定分隔符为制表符就可以把日期时间都准确入库了