如何将GNU awk命令改写为适配macOS默认awk可正常运行的版本
需求背景
现有文件每行采用|作为分隔符,格式示例如下:
Z|X|20210903|07:00:00|S|33|27.71||
期望在每行末尾追加转换后的日期时间字段,输出示例如下:
Z|X|20210903|07:00:00|S|33|27.71|||03-09-2021 07:00:00
现有问题
原本在GNU Awk环境下可正常运行的命令如下:
gawk -F'|' '{dt = gensub(/(....)(..)(..)/,"\\3-\\2-\\1",1,$3); print $0"|"dt,$4}' infile > outfile
但该命令在macOS Catalina及更高版本的默认预装awk环境中运行报错:
awk: calling undefined function gensub input record number 1, file source line number 1
报错原因是macOS默认搭载的是BSD版本awk,不支持GNU Awk专属的gensub函数。
兼容版解决方案
可以改用所有awk版本均支持的substr字符串截取函数实现相同逻辑,兼容命令如下:
awk -F'|' '{dt = substr($3,7,2)"-"substr($3,5,2)"-"substr($3,1,4); print $0"|"dt" "$4}' infile > outfile
该命令直接对第三个字段(格式为YYYYMMDD的日期)按字符位置截取年、月、日,拼接为DD-MM-YYYY格式后和第四个字段的时间组合,最终追加到原行末尾,输出结果和原GNU awk命令完全一致。
内容的提问来源于stack exchange,提问作者user3439894
相关产品推荐
相关产品推荐

