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