You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:54:00