Búsqueda de sitios web

Diferentes formas de utilizar el comando de columna en Linux


¿Alguna vez se ha visto 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 al formato CSV para enviarlo a la base de datos. Después de limpiar y crear el resultado en formato CSV, mi resultado no es visualmente atractivo 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 columnalistas de columnas”. En palabras simples, la columna es una utilidad sencilla que puede formatear su salida en un formato de columna (filas y campos) según la estructura de su archivo fuente. El comando columna es parte del paquete util-linux.

Un punto importante a tener en cuenta aquí es que el comando columna se comporta de manera diferente en las distribuciones basadas en Debian y en Rhel. La razón es que la distribución basada en Debian usa “columna” de bsdmainutils en lugar de util-linux. La versión anterior del comando column es más reciente que el paquete bsdmainutils. Eche un vistazo al 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 utilizar el comando columna, un buen lugar para comenzar será la página de manual y explorar sus opciones.

man column

Listar el contenido del archivo en formato tabular

El comando 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 observar la imagen de arriba, puede pensar que esto no es lo que esperábamos y que el resultado puede parecer extraño. ¡Sí! Tienes razón. Las columnas consideran el espacio como delimitador predeterminado al crear una tabla. Este comportamiento se puede anular pasando un delimitador personalizado.

Delimetro personalizado

Los delimitadores personalizados le brindan una amplia gama de opciones con las que trabajar. Para crear un delimitador personalizado, utilice 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á muy 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 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 las ignora de forma predeterminada. 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 puedes 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 columna. Pero la columna (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 tiene el formato adecuado y 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 la bandera -x puedes convertir filas en columnas. Este comportamiento es el mismo en las variantes rhel y ubuntu del comando de columna. Esta es una característica muy útil cuando tienes que tomar un campo determinado mediante el comando awk o columna y luego convertirlo en el encabezado de tu archivo CSV.

column -x fillcols.txt

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

Buscar tamaño de columna

La columna usa una variable ambiental ($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. Puedes ver la diferencia en cómo la columna imprime la tabla cuando cambiamos el tamaño del terminal.

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

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