将 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
给定一个包含多行的文件,例如:
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