[colug-432] Nice Plain Text Columns and Avoiding NIH

Eric Floehr eric at intellovations.com
Mon Aug 8 10:23:23 EDT 2011

I agree with the awk suggestion...

Here is what I would do.  The original program is this:

Which outputs tab-delimited lines... here is the actual code at the
bottom of the program:

   for (j=0;j<i && True;j++) {
      if (False) {
         print j
         print price[j]
         print name[j]
         print address[j,0]
         print area[j]
         print reporter[j]
         print time[j]
         print timeAgo[j]

      print price[j] delimiter name[j] delimiter address[j,0]
delimiter area[j] delimiter reporter[j] delimiter time[j] delimiter

What I would do it iterate through once 0 to i and get the length of
the longest string in each array.  Then iterate through again using
printf with the column widths + 1 something like this...

   pricemax = namemax = addressmax = areamax = reportermax = timemax =
timeAgomax = 0
   for (j=0;j<i;j++) {
      if pricemax < length(price[j]) { pricemax = length(price[j]) }
      if namemax < length(name[j]) { namemax = length(name[j]) }

   formatstring = "%"$pricemax"s %"$namemax"s %"..."\n"
   for (j=0;j<i;j++) {
      printf(formatstring, price[j], name[j], ...)

This is pseudocode, but it seems that this would solve the problem
without too much effort.  I'm not a huge awk programmer so there might
be better ways to get the length of the longest string in an array, or
even a better way to do this.

Now this solves the problem for this particular instance.  If you are
looking for a general way to turn tabs into spaces while ensuring
columns line up correctly (i.e. adding spaces where columns are longer
than the default tab length), I don't have an answer.


More information about the colug-432 mailing list