Combinar y transformar archivos de texto

LinuxBeginner
Practicar Ahora

Introducción

Los archivos de texto pueden relacionarse de distintas maneras. A veces es necesario normalizar caracteres; otras veces, dos archivos se corresponden por la posición de sus líneas; en otros casos, los registros comparten una clave. Elegir la herramienta adecuada es más importante que memorizar sus opciones.

En este laboratorio conocerá tres herramientas específicas: tr transforma un flujo de caracteres, paste combina líneas según su posición y join combina registros ordenados mediante un campo compartido. Observará cada entrada y verificará el archivo resultante antes de crear un pequeño informe.

Traducir y limpiar un flujo de caracteres

En este paso, utilizará tr para traducir caracteres, agrupar separadores repetidos y eliminar caracteres no deseados.

Cree una línea deliberadamente inconsistente. A continuación, cat -A hará visibles detalles que normalmente no se muestran: los espacios seguirán siendo visibles como separaciones y $ marcará el final de la línea. Esto le ayudará a ver exactamente qué debe limpiar:

cd /home/labex/project/text-combine-lab
printf '  API,,,Worker,,WEB  \n' > raw-services.txt
cat -A raw-services.txt

tr SET1 SET2 reemplaza los caracteres del primer conjunto por los caracteres correspondientes del segundo. Las clases portables [:upper:] y [:lower:] representan letras mayúsculas y minúsculas:

tr '[:upper:]' '[:lower:]' < raw-services.txt

Ahora conecte tres etapas mediante una canalización. La primera traduce el uso de mayúsculas y minúsculas; tr -s ',' agrupa cada secuencia de comas repetidas en una sola coma; tr -d ' ' elimina los caracteres de espacio; y tee muestra y guarda el flujo final:

tr '[:upper:]' '[:lower:]' < raw-services.txt | tr -s ',' | tr -d ' ' | tee clean-services.txt

El resultado debe ser api,worker,web. tr lee un flujo; no modifica el archivo de entrada directamente.

Combinar líneas correspondientes con Paste

En este paso, combinará archivos cuyas primeras líneas se corresponden, cuyas segundas líneas se corresponden, y así sucesivamente.

Cree una columna con nombres de servicios y otra con sus responsables:

cd /home/labex/project/text-combine-lab
printf '%s\n' api worker web > services.txt
printf '%s\n' team-blue team-green team-blue > owners.txt

paste coloca las líneas correspondientes una junto a otra y utiliza una tabulación de forma predeterminada:

paste services.txt owners.txt

Elija la coma como delimitador con -d, y use tee para mostrar y guardar un archivo similar a un archivo CSV:

paste -d, services.txt owners.txt | tee service-owners.csv

paste no compara claves. Si a un archivo le faltan líneas o sus líneas están reordenadas, la correspondencia cambiará.

Unir registros mediante una clave compartida

En este paso, combinará registros mediante un primer campo coincidente, en lugar de hacerlo según la posición de las líneas.

Cree dos tablas delimitadas por espacios y con órdenes diferentes:

cd /home/labex/project/text-combine-lab
printf '%s\n' 'web 8080' 'api 9000' 'worker 9100' > ports-unsorted.txt
printf '%s\n' 'worker active' 'web active' 'api maintenance' > states-unsorted.txt

join espera que ambas entradas estén ordenadas por el campo de unión. Prepare copias ordenadas. En sort -k1,1, -k selecciona una clave y 1,1 significa «comenzar y terminar con el campo 1», por lo que solo el nombre del servicio determina el orden:

sort -k1,1 ports-unsorted.txt > ports.txt
sort -k1,1 states-unsorted.txt > states.txt

Inspeccione los archivos y, después, una los valores coincidentes del campo 1:

cat ports.txt
cat states.txt
join ports.txt states.txt | tee service-details.txt

Cada resultado contiene una sola vez la clave de servicio compartida, seguida del puerto y del estado.

Crear un informe de servicios legible

En este paso, cambiará la estructura de los registros unidos sin modificar las tablas de origen.

Convierta los espacios en comas para producir un informe sencillo:

cd /home/labex/project/text-combine-lab
tr ' ' ',' < service-details.txt | tee service-report.csv

Añada un encabezado agrupando dos comandos. Las llaves envían la salida de ambos comandos a una única redirección:

{ echo 'service,port,state'; cat service-report.csv; } > service-report-with-header.csv
cat service-report-with-header.csv

Cuente los registros de datos sin contar el encabezado:

tail -n +2 service-report-with-header.csv | wc -l | tr -d ' ' > service-count.txt
cat service-count.txt

Este flujo de trabajo conserva etapas pequeñas y fáciles de inspeccionar: datos normalizados, datos unidos, datos formateados y, finalmente, el informe.

Resumen

Utilizó tr para la normalización a nivel de caracteres, paste para crear columnas según la posición y join para establecer relaciones mediante claves ordenadas. Después, combinó estas etapas pequeñas en un informe CSV legible y mantuvo intactos los archivos de entrada originales.