Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to output an array's content in columns in BASH

Tags:

arrays

bash

list

I wanted to display a long list of strings from an array.

Right now, my script run through a for loop echoing each value to the standard output:

for value in ${values[@]}
do
  echo $value
done

Yeah, that's pretty ugly! And the one column listing is pretty long too...

I was wondering if i can find a command or builtin helping me to display all those values in columns, like the ls command does by default when listing a directory (ls -C).

[Update]

Losing my brain with column not displaying properly formatted columns, here's more info:

The values:

$ values=( 01----7 02----7 03-----8 04----7 05-----8 06-----8 07-----8 08-----8 09---6 10----7 11----7 12----7 13----7 14-----8 15-----8 16----7 17----7 18---6 19-----8 20-----8 21-----8)

Notice the first two digits as an index and the last one indicating the string length for readability.

The command: echo " ${values[@]/%/$'\n'}" | column

The result: bad columns http://tychostudios.ch/multipurpose/bad_columns.png

Something is going wrong...

like image 630
Arko Avatar asked Jun 10 '10 13:06

Arko


2 Answers

You could pipe your output to column.

column seems to struggle with some data in a single-column input being narrower than a tabstop (8 characters).

Using printf within a for-loop to pad values to 8 characters seems to do the trick:

for value in "${values[@]}"; do 
    printf "%-8s\n" "${value}"
done | column
like image 198
Johnsyweb Avatar answered Sep 23 '22 18:09

Johnsyweb


I know this is an old thread, but I get erratic results from column so I thought I'd give my solution. I wanted to group every 3 lines into 3 evenly spaced columns.

cat file.txt | xargs printf '%-24s\n' | sed '$p;N;s/\n//;$p;N;s/\n//'

Basically, it pipes each line into printf, which left-aligns it into a 24-character-wide block of whitespace, which is then piped into sed. sed will look ahead 2 lines into the future and remove the line break.

The N command reads the next line into the current buffer, and s/\n// removes the line break. In short, what we want is 'N;N;s/\n//g', which will work in some cases. The problem is, if there aren't two extra lines to throw in the buffer, sed will quit suddenly. The $p commands pre-empt that by saying "If this is the last line, print the buffer contents immediately".

like image 34
jimmetry Avatar answered Sep 24 '22 18:09

jimmetry