Skip to main content
added 241 characters in body
Source Link
Ed Morton
  • 36k
  • 6
  • 25
  • 60

Alternatively, the same approach using any awk where you just have to write the code yourself to split each record into fields using a loop calling match() on FPAT and store those fields in an array rather than the above where gawk does that for you as part of normal field splitting:

Alternatively, the same approach using any awk:

Alternatively, the same approach using any awk where you just have to write the code yourself to split each record into fields using a loop calling match() on FPAT and store those fields in an array rather than the above where gawk does that for you as part of normal field splitting:

deleted 8 characters in body
Source Link
Ed Morton
  • 36k
  • 6
  • 25
  • 60
$ 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 ( rowNr=1; rowNr<=NR; rowNr++ ) { for ( i=1; i<=NF; i++ ) { printf "%*s%s", wids[i], flds[rowNr,i], (i<NF ? OFS : ORS) } } } 
$ 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 ( rowNr=1; rowNr<=NR; rowNr++ ) { for ( i=1; i<=NF; i++ ) { printf "%*s%s", wids[i], flds[rowNr,i], (i<NF ? OFS : ORS) } } } 
$ cat tst.awk BEGIN { FPAT = "([^,]*)|(\"([^\"]|\"\")*\")" OFS = ", " } { for ( i=1; i<=NF; i++ ) { flds[NR,i] = $i wid = length($i) wids[i] = ( wid > wids[i] ? wid : wids[i] ) } } END { for ( rowNr=1; rowNr<=NR; rowNr++ ) { for ( i=1; i<=NF; i++ ) { printf "%*s%s", wids[i], flds[rowNr,i], (i<NF ? OFS : ORS) } } } 
added 807 characters in body
Source Link
Ed Morton
  • 36k
  • 6
  • 25
  • 60
$ 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.

$ cat tst.awk BEGIN { FPAT = "([^,]*)|(\"([^\"]|\"\")*\")" OFS = ", " } NR==FNR { for ( i=1; i<=NF; i++ ) { wid = length($i) wids[i] = ( wid > wids[i] ? wid : wids[i] ) flds[NR,i] = $i } } END { for ( rowNr=1; rowNr<=NR; rowNr++ ) { for ( i=1; i<=NF; i++ ) { printf "%*s%s", wids[i], flds[rowNr,i], (i<NF ? OFS : ORS) } } } 

Tweak the "any awk" version similarly if desired.

$ 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 ( rowNr=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 = "([^,]*)|(\"([^\"]|\"\")*\")" 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++ ) { printf "%*s%s", wids[i], flds[rowNr,i], (i<nf ? OFS : ORS) } } } 
added 771 characters in body
Source Link
Ed Morton
  • 36k
  • 6
  • 25
  • 60
Loading
added 9 characters in body
Source Link
Ed Morton
  • 36k
  • 6
  • 25
  • 60
Loading
added 846 characters in body
Source Link
Ed Morton
  • 36k
  • 6
  • 25
  • 60
Loading
Source Link
Ed Morton
  • 36k
  • 6
  • 25
  • 60
Loading