Viewing Linux output in columns

Government building with greek columns
Credit: Thinkstock

The Linux column command makes it easy to display data in a columnar format -- often making it easier to view, digest, or incorporate into a report. While column is a command that's simple to use, it has some very useful options that are worth considering. In the examples in this post, you will get a feel for how the command works and how you can get it to format data in the most useful ways.

By default, the column command will ignore blanks lines in the input data. When displaying data in multiple columns, it will organize the content by filling the left column first and then moving to the right. For example, a file containing numbers 1 to 12 might be displayed in this order:

1       4       7       10
2       5       8       11
3       6       9       12

A file with some well known lyrics might look like this:

$ cat RR
I've been working on the railroad
All the live long day
I've been working on the railroad
Just to pass the time away

Can't you hear the whistle blowing
Rise up so early in the morn
Can't you hear the whistle blowing
Dinah, blow your horn

Dinah, won't you blow
Dinah, won't you blow
Dinah, won't you blow your horn
Dinah, won't you blow,
Dinah, won't you blow,
Dinah, won't you blow your horn

When we pass the file of lyrics through the column command, we'll see it in this space-saving format:

$ column RR
I've been working on the railroad       Dinah, blow your horn
All the live long day                   Dinah, won't you blow
I've been working on the railroad       Dinah, won't you blow
Just to pass the time away              Dinah, won't you blow your horn
Can't you hear the whistle blowing      Dinah, won't you blow,
Rise up so early in the morn            Dinah, won't you blow,
Can't you hear the whistle blowing      Dinah, won't you blow your horn

Note that the blank lines we saw in the original file have been removed. If you want the empty lines included in your output, simply use the -e (include empty) option.

$ column -e RR
I've been working on the railroad       Dinah, blow your horn
All the live long day
I've been working on the railroad       Dinah, won't you blow
Just to pass the time away              Dinah, won't you blow
                                        Dinah, won't you blow your horn
Can't you hear the whistle blowing      Dinah, won't you blow,
Rise up so early in the morn            Dinah, won't you blow,
Can't you hear the whistle blowing      Dinah, won't you blow your horn

If you want the data displayed from left to right and then down (row first rather than column first), use the -x option. Think of this as selecting the X axis in a graph.

$ column -x RR
I've been working on the railroad       All the live long day
I've been working on the railroad       Just to pass the time away
Can't you hear the whistle blowing      Rise up so early in the morn
Can't you hear the whistle blowing      Dinah, blow your horn
Dinah won't you blow                    Dinah won't you blow
Dinah, won't you blow your horn         Dinah, won't you blow,
Dinah, won't you blow,                  Dinah, won't you blow your horn

If the fields in your file are separated by commas, colons, or some other character, you can place each field in its own “cell” by specifying the employed delimiter. Say this were the input file:

$ cat abc
a:b:c:d:e

Using the column command with the delimeter specified, we would get this:

$ column -t -s: abc
a  b  c  d  e

In the command below, we send the data using a pipe and get the same effect. The other lines were added to label the two arguments.

     create table -----+   +----- input delimeter 
                       |   |
                       V   V
$ echo a:b:c | column -t -s:
a  b  c

The column command creates as many columns as it has room for in your terminal window. Stretch out your terminal window and you might see more columns. And each column will have the same width regardless of how long the content in any particular column will be. The longest line in your file will determine the column width. If any line takes more than half the width of your terminal window, you'll only get one column in your entire display.

$ cat poem
The rain
in Spain
falls mainly
on the plain

and that is why
the plain is so
very wet
$ column poem
The rain        falls mainly    and that is why very wet
in Spain        on the plain    the plain is so

If the last three lines were a single line, the output would look like this instead.

$ column poem
The rain
in Spain
falls mainly
on the plain
and that is why the plain is so very wet

On the other hand, you can specify the width of your display (even if it exceeds the width of the actual display) using the -c option. If you specify a ridiculously wide display, your data will wrap around on your display, but it still might be a single line. Here's what the RR file would look like on a typical terminal window if we tell the command that our window is 1,000 characters wide:

$ column -c 1000 RR
I've been working on the railroad     All the live long day                I
've been working on the railroad      Just to pass the time away           C
an't you hear the whistle blowing     Rise up so early in the morn         C
an't you hear the whistle blowing     Dinah, blow your horn                D
inah won't you blow                   Dinah won't you blow                 D
inah, won't you blow your horn        Dinah, won't you blow,               D
inah, won't you blow,                 Dinah, won't you blow your horn

Yet, it's easy to show that it's actually a single line of text:

$ column -c 1000 RR | wc -l
1

If you want a simple list showing how many times each user has logged in recently, you can use the column command in a pipe like this:

$ last | grep pts | awk '{print $1}' | sort | uniq -c | column
     12 jdoe         41 mdoe         25 shs         19 aguy

You can also use the column command in a script to make some potentially useful tables. In the script below, we’re using the column command to create a table with numbers from 1 to 50.

#!/bin/bash

for y in {1..5}
do
  for x in {1..10}
    do echo -n "| $((y*x)) "
  done
  echo
done | column -t
$ ./doit
|  1   |  2   |  3   |  4   |  5   |  6   |  7   |  8   |  9   |  10
|  2   |  4   |  6   |  8   |  10  |  12  |  14  |  16  |  18  |  20
|  3   |  6   |  9   |  12  |  15  |  18  |  21  |  24  |  27  |  30
|  4   |  8   |  12  |  16  |  20  |  24  |  28  |  32  |  36  |  40
|  5   |  10  |  15  |  20  |  25  |  30  |  35  |  40  |  45  |  50

The column command probably isn’t going to make anyone’s top 10 list, but it can save you a lot of time when you might otherwise have to reorganize data by hand.

Join the Network World communities on Facebook and LinkedIn to comment on topics that are top of mind.
Must read: 10 new UI features coming to Windows 10