Saltar la navegación

column

La orden column sirve para mostrar información tabulada (en columnas) por la salida estándar. La información la obtiene de los ficheros especificados o de la entrada estándar en su ausencia. La sintaxis general de uso es:

column [opción...] [fichero...]

En el siguiente ejemplo column muestra tabuladas las líneas de los ficheros f1.txt y f2.txt, rellenando las columnas con las líneas de los ficheros en el orden en el que estos aparecen. El número de columnas se calcula en base a la anchura de la ventana donde se ejecuta el shell y la longitud de la línea más larga que haya en los ficheros. Solo quedarán huecos en la última columna (en la ventana del shell donde se ejecutó este ejemplo solo cabían cuatro columnas). El número total de filas se calcula con el número total de líneas que hay que distribuir por columnas.

$ cat f1.txt 
comida
casiseta
playa
ciclismo
campeonato
estudiar
ambicioso
estado
$ cat f2.txt
once
doce
trece
catorce
quince
dieciseis
diecisite
dieciocho
diecinueve
veinte
$ column f1.txt f2.txt
comida      estudiar     trece        dieciocho
casiseta    ambicioso    catorce      diecinueve
playa       estado       quince       veinte
ciclismo    once         dieciseis
campeonato  doce         diecisite

Podemos especificar el ancho máximo en el que se tienen que distribuir las columnas, para lo que utilizaremos la opción -c:

$ column -c 50 f1.txt f2.txt 
comida      ambicioso   quince
casiseta    estado      dieciseis
playa       once        diecisite
ciclismo    doce        dieciocho
campeonato  trece       diecinueve
estudiar    catorce     veinte

La forma de distribuir las columnas la podemos cambiar con la opción -x, que hace que se rellenen las columnas por filas y no por columnas como en los ejemplos anteriores. Con este tipo de reparto, los huecos quedan en la última fila. Veamos un ejemplo:

$ column -x -c 70 f1.txt f2.txt 
comida      casiseta    playa        ciclismo
campeonato  estudiar    ambicioso    estado
once        doce        trece        catorce
quince      dieciseis   diecisite    dieciocho
diecinueve  veinte

Por defecto las líneas en blanco son ignoradas y no entran en el reparto. Si queremos que también intervengan usaríamos la opción -e:

$ cat f3.txt
uno

dos

$ column f3.txt
uno    dos
$ column -e f3.txt
uno        dos

También column puede mostrar tabuladas las palabras de las líneas de los ficheros. Con la opción -t cada línea de los ficheros se mostrará en una línea tabulada por palabras. El número de columnas vendrá dado por el mayor número de palabras que tenga una línea. El número de filas coincidirá con el número total de filas de los ficheros.

La opción -t entiende las palabras como todo aquello que está separado por una secuencia de espacios y/o tabuladores.

Un ejemplo de lo anterior es el siguiente: la orden mount muestra una información aparentemente desordenada, pero cada línea tiene las mismas palabras, solo que con distinta longitud, y esto es lo que da la apariencia de desorden. La orden column con la opción -t nos resuelve este problema.

$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61486,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=50224k,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=316300k)
rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)
none on /media/sf_Tmp type vboxsf (rw,nodev,relatime) $ mount | column -t sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61486,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=50224k,mode=755) /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=316300k) rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime) none on /media/sf_Tmp type vboxsf (rw,nodev,relatime)

Como vemos, la orden column divide las líneas en campos, que por defecto son palabras; el delimintador de campos es, como se ha dicho anteriormente, una secuencia de espacios y/o tabuladores. Pero a veces interesa que esta división se haga por otro carácter. Esto lo podemos conseguir con la opción -s especificando uno o más caracteres separadores de campos. Esta opción solo trabaja junto con -t.

Cuando mostramos el fichero /etc/passwd da la sensación, como con la orden mount, que está desordenado, aunque todas sus líneas tienen los mismos campos. Aquí los campos no son palabras, sino que están separados por el carácter dos puntos. La opción -s nos ayuda en este caso:

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh $ column -t -s : /etc/passwd root x 0 0 root /root /bin/bash daemon x 1 1 daemon /usr/sbin /bin/sh bin x 2 2 bin /bin /bin/sh sys x 3 3 sys /dev /bin/sh sync x 4 65534 sync /bin /bin/sync games x 5 60 games /usr/games /bin/sh man x 6 12 man /var/cache/man /bin/sh lp x 7 7 lp /var/spool/lpd /bin/sh mail x 8 8 mail /var/mail /bin/sh news x 9 9 news /var/spool/news /bin/sh

El problema que surge en casos como el anterior, es que a veces, algún campo está vacío y entonces, concretamente en el fichero /etc/passwd habrá secuencias de dos puntos (::, :::, ::::). El funcionamiento normal de column hace que las repeticiones del separador se entiendan como un único separador y por lo tanto no se distinguirán los campos vacíos, con lo que se mostrarán en las columnas información de distintos tipos. Esto puede verse en las siguientes líneas que forman parte de la salida del ejemplo anterior:

saned              x  110    118    /home/saned                         /bin/false
Debian-gdm         x  111    119    Gnome Display Manager               /var/lib/gdm3               /bin/false
usuario            x  1000   1000   usuario,,,                          /home/usuario               /bin/bash
vboxadd            x  999    1      /var/run/vboxadd                    /bin/false
telnetd            x  112    120    /nonexistent                        /bin/false

Para evitarlo, está la opción -n, la cual divide las líneas en campos mediante una única aparición del separador. Así, el ejemplo anterior, será completamente correcto si escribimos lo siguiente:

$ column -tns : /etc/passwd

y las cinco líneas anteriores aparecerán así:

saned              x  110    118                                        /home/saned                 /bin/false
Debian-gdm         x  111    119    Gnome Display Manager               /var/lib/gdm3               /bin/false
usuario            x  1000   1000   usuario,,,                          /home/usuario               /bin/bash
vboxadd            x  999    1      /var/run/vboxadd            /bin/false
telnetd            x  112    120    /nonexistent                /bin/false

Licencia: licencia de software libre GPL