Diferentes formas de usar el comando de columna en Linux


¿Alguna vez ha estado en la situación de trabajar con archivos CSV y producir resultados en formato tabular estructurado? Recientemente estuve trabajando con la limpieza de datos en un archivo que no tiene la estructura adecuada. Tiene tantos espacios en blanco entre cada columna y tengo que convertirlo a formato CSV para enviarlo a la base de datos. Después de limpiar y crear la salida en formato CSV, mi salida no es visualmente atractiva para verificar la integridad de los datos en el archivo CSV. Este es el momento en que el comando "Columna" me resulta útil.

Según la página de manual, el comando de columna "listas de columnas". En palabras simples, la columna es una utilidad simple que puede formatear su salida en un formato de columna (filas y campos) según la estructura de su archivo fuente. El comando de columna es parte del paquete util-linux.

Un punto importante a tener en cuenta aquí es que el comando de columna se comporta de manera diferente en el informe de error para saber más sobre esto.

$ dpkg -S $(which column)

Para fines de demostración, estoy usando CentOS 7 y mostraré diferentes opciones entre Ubuntu y CentOS 7. Para verificar la versión de la columna, ejecute el siguiente comando. Este comando también mostrará la versión del paquete util-linux.

$ column --version  # will not work in Debian/ubuntu

También puede verificar la versión de util-linux ejecutando los siguientes comandos.

$ rpm -qa | grep -i util-linux   # Redhat,Centos,Fedora,Amazon Linux
$ dpkg -l | grep -i util-linux    # Ubuntu

Antes de usar el comando de columna, un buen lugar para comenzar será la página de manual y explorar sus opciones.

$ man column

Mostrar el contenido del archivo en formato tabular

El comando de columna puede crear una tabla pasando el nombre del archivo como argumento junto con el indicador -t . Estoy usando/etc/passwd como archivo de entrada.

$ column -t /etc/passwd

Al mirar la imagen de arriba, puede pensar que esto no es lo que esperábamos y el resultado puede parecer extraño. ¡Sí! Tienes razón. Las columnas consideran el espacio como el delimitador predeterminado al crear una tabla. Este comportamiento se puede anular pasando un delimitador personalizado.

Delímetro personalizado

Los delimitadores personalizados le brindan una amplia gama de opciones con las que trabajar. Para crear un delimitador personalizado, use el indicador -s seguido de un delimitador. Ahora usaremos “:” como delimitador para dividir el archivo/etc/passwd.

$ column -s ":"  -t /etc/passwd

Mire la imagen de arriba donde la tabla está bien formateada y estructurada. Desde la versión 2.23 de util-linux, la opción -s se ha cambiado para que no sea codiciosa.

Ahora ejecute el mismo comando en Ubuntu y el resultado será codicioso. Esto se debe a que el comando de columna (bsdmainutils) en Ubuntu tratará varias palabras adyacentes como una sola palabra.

$ column -s ":"  -t /etc/passwd

Para superar este comportamiento, utilice el indicador -n .

$ column -t -s ":" -n /etc/passwd             # Only on Debian/Ubuntu

Ignorar líneas blancas vacías en la salida del archivo

Cuando tiene líneas en blanco en su archivo de entrada, el comando de columna lo ignora por defecto. Vea mi archivo de entrada que está en formato CSV y agregué una línea en blanco entre cada línea. Ahora creemos una tabla como lo hicimos antes con este archivo de entrada.

$ column -t -s ";" dummy.txt

En la imagen de arriba, puede ver que mi archivo de entrada dummy.txt tiene líneas vacías y cuando intento crear una tabla, las líneas vacías se ignoran.

Nota: Este es el comportamiento predeterminado para la variante "bsdmainutils/util-linux" del comando de columna. Pero column (bsdmainutils) tiene la opción de anular este comportamiento pasando el indicador -e .

$ column -e -t -s "," dummy.txt        # Only on Debian/Ubuntu

En la imagen de arriba, puede ver que la tabla está formateada correctamente y que las líneas vacías no se ignoran.

Separador de salida de archivos

De forma predeterminada, se utilizarán dos espacios en blanco como separadores de salida. Este comportamiento se puede anular pasando el indicador -o . No tendrá una opción de separador de salida disponible en la columna (bsdmainutils).

$ column -t -s "," -o "||" dummy.txt	# Only on Rhel based distro

Convertir filas de archivos en columnas

Usando el -x la bandera puede convertir filas en columnas. Este comportamiento es el mismo en las variantes rhel y ubuntu del comando column. Esta es una característica muy útil cuando tiene que tomar un determinado campo a través del comando awk o column y luego convertirlo en el encabezado de su archivo CSV.

$ column -x fillcols.txt

Cuando ejecuta el comando de columna sin usar ningún indicador, el comportamiento será el mismo que pasar el indicador -x .

Encontrar tamaño de columna

La columna usa una variable de entorno ($COLUMNS) para averiguar el tamaño de su terminal y, según el tamaño, use el comando echo, el tamaño de la tabla se mostrará en el terminal.

$ echo $COLUMNS

Hecha un vistazo a la imagen de abajo. Inicialmente, cambié el tamaño de mi terminal para tener $COLUMNS el tamaño establecido en 60 y ejecuté el comando de columna. Nuevamente cambié el tamaño de mi terminal para tener $COLUMNS el tamaño establecido en 114 y ejecuté el comando de columna nuevamente. Puede ver la diferencia en cómo la columna imprime la tabla cuando cambiamos el tamaño de la terminal.

$ column -t -s ":" /etc/passwd | head 5

Eso es todo por este artículo. Si tiene algún comentario, envíelo en la sección de comentarios.