$ cat tst.awk BEGIN { FPAT = "([^,]*)|(\"([^\"]|\"\")*\")" OFS = ", " } NR==FNR { for ( i=1; i<=NF; i++ ) { flds[NR,i] = $i wid = length($i) wids[i] = ( wid > wids[i] ? wid : wids[i] ) } } END { for ( flds[NRrowNr=1; rowNr<=NR; rowNr++ ) { for ( i=1; i<=NF; i++ ) { printf "%*s%s", wids[i], flds[rowNr,i], (i<NF ? OFS : ORS) } } }
$ awk -f tst.awk file a, b, c, some stuff, "some, other, stuff", d, 2023-03-10 18:37:00 y, x, z, t, cool, thing, 2022-04-12 21:44:00
and the any awk version:
$ cat tst.awk BEGIN { FPAT = $i"([^,]*)|(\"([^\"]|\"\")*\")" OFS = ", " } { nf = 0 rec = $0 while ( (rec != "") && match(rec,FPAT) ) { fld = substr(rec,RSTART,RLENGTH) flds[NR,++nf] = fld wid = length(fld) wids[nf] = ( wid > wids[nf] ? wid : wids[nf] ) rec = substr(rec,RSTART+RLENGTH+1) } } END { for ( rowNr=1; rowNr<=NR; rowNr++ ) { for ( i=1; i<=NF;i<=nf; i++ ) { printf "%*s%s", wids[i], flds[rowNr,i], (i<NFi<nf ? OFS : ORS) } } }
Tweak the "any awk" version similarly if desired.