将 GNU awk 命令转换为默认的 macOS awk 命令

Convert GNU awk command to default macOS awk command

给定一个包含多行的文件,例如:

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,); print [=12=]"|"dt,}' infile > outfile

但是,我需要它在默认安装的 awk 版本的 macOS 下工作,它会产生以下错误:

awk: calling undefined function gensub
 input record number 1, file 
 source line number 1

我假设 macOS 中 awk 的默认版本太旧并且不支持 gensub 功能。

请注意,我尝试了许多其他字符串函数均无济于事。 awk 编程不在我的专业领域,我通过大量谷歌搜索从上面的 GNU awk 命令中得出,但我的 google-fu 未能成功尝试使某些东西与 macOS awk.

是否可以重写上述 GNU awk 命令以与 awk 的默认版本一起使用,例如 macOS Catalina,如果是的话如何?

使用 perl 代替 gawk:

$ perl -lne '
   my @F = split /[|]/, $_, -1;
   my $dt = ($F[2] =~ s/(....)(..)(..)/--/r);
   print join("|", @F, "$dt $F[3]")' <<<"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

请您尝试以下操作:

awk -F'|' '{dt=substr(,7,2) "-" substr(,5,2) "-" substr(,1,4); print [=10=] "|" dt, }' infile > outfile