我有数百万行数据,我的老板要求我重新格式化它们。
格式为:
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
导致修改后的记录被输出。
这适用于awk
macOS 上的默认设置。它不需要特殊的日期格式化函数,因为它将输入日期视为字符串并简单地重新组织它。关于日期的唯一假设是它始终采用DD/MM/YYYY
输入中的格式,并且应该采用YYYYMMDD
输出中的格式。
答案2
您不需要像strftime
日期处理这样的功能,因为您所需要做的就是交换字段。sed
在这里工作得很好:
sed 's@\([^/]*\)/\([^/]*\)/\([^,]*\)@\3\1\2@' sample