Home > Mobile >  Convert GNU awk command to default macOS awk command
Convert GNU awk command to default macOS awk command

Time:09-22

Given a file containing many lines such as, e.g.:

Z|X|20210903|07:00:00|S|33|27.71||

With wanted output of, e.g.:

Z|X|20210903|07:00:00|S|33|27.71|||03-09-2021 07:00:00

This GNU awk command works:

gawk -F'|' '{dt = gensub(/(....)(..)(..)/,"\\3-\\2-\\1",1,$3); print $0"|"dt,$4}' infile > outfile

However, I need this to work under macOS with the version of awk that is installed by default, and it produces the following error:

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

I'm assuming the default version of awk in macOS is too old and doesn't support the gensub function.

Note that I have tried numerous other string functions to no avail. awk programming is not in my area of expertise and I derived at the GNU awk command above thru a fair amount of googling, but my google-fu was unsuccessful in trying to get something to work with macOS awk.

Can the above GNU awk command be rewritten to work with the default version of awk in, e.g., macOS Catalina and if so how?

CodePudding user response:

Would you please try the following:

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

CodePudding user response:

Using perl instead of gawk:

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