在 macOS 上使用 awk/gawk 转换日期格式

在 macOS 上使用 awk/gawk 转换日期格式

我有数百万行数据,我的老板要求我重新格式化它们。

格式为:

06/28/2022,04:00,142.01,142.38,141.59,142.15,3151
06/28/2022,04:01,142.1,142.1,142.1,142.1,196

我需要将第一个日期字段重新格式化为:

20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196

%Y%m%d

我有以下内容:

gawk -F"," '{OFS=","; $1=strftime("%Y%m%d", $1); print $0}' AAPL.txt > AAPL.csv

但奇怪的是它有效,但生成的日期是 1969 年。

19691231,04:00,142.01,142.38,141.59,142.15,3151
19691231,04:01,142.1,142.1,142.1,142.1,196

我不明白为什么。我之所以选择这个,gawk是因为awk在 MacOS 上没有strftime,并且date外部调用会造成巨大的性能损失。

答案1

您的代码没有执行您期望的操作,因为 GNUawk strftime()期望 Unix 时间戳作为其第二个参数。它无法解析任意日期时间字符串。

然而,我们实际上并不需要strftime()这里。

$ awk -F , 'BEGIN { OFS=FS } { split($1,a,"/"); $1 = a[3] a[1] a[2] }; 1' file
20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196

这将输入的每一行视为简单的逗号分隔字段,并将第一个此类字段拆分/到数组中a。然后将第一个字段重新形成为按所需顺序连接的数组元素。

1代码末尾的孤岛awk导致修改后的记录被输出。

这适用于awkmacOS 上的默认设置。它不需要特殊的日期格式化函数,因为它将输入日期视为字符串并简单地重新组织它。关于日期的唯一假设是它始终采用DD/MM/YYYY输入中的格式,并且应该采用YYYYMMDD输出中的格式。

答案2

您不需要像strftime日期处理这样的功能,因为您所需要做的就是交换字段。sed在这里工作得很好:

sed 's@\([^/]*\)/\([^/]*\)/\([^,]*\)@\3\1\2@' sample

相关内容