Tutoriales

Analizar archivo CSV con script Bash en Linux

Valores Separados por Comas alias CSV es un dato semiestructurado que usa comas como delimitadores para separar palabras. El formato de archivo CSV es muy popular entre los profesionales de datos porque tienen que lidiar con una gran cantidad de archivos CSV y procesarlos para crear información. En este artículo, nos centraremos en cómo analizar un archivo CSV en un script de shell Bash en Linux.

Para la mayor parte de este artículo, usaré awk y sed Herramientas para analizar csv en lugar de combinar diferentes comandos, p. grep, cut, tretc

Esta awk Las utilidades reducen la complejidad de canalizar múltiples comandos o escribir bucles con lógica para obtener datos.En cambio, puedes awk Hacer el trabajo.

1. Prepare el archivo CSV para su procesamiento

Su archivo CSV puede haber sido generado a partir de una base de datos, API, o puede haber ejecutado algunos comandos y convertido la salida a delimitadores con formato CSV. En cualquier caso, debe analizar el conjunto de datos antes de ejecutar la lógica en él.

Como práctica recomendada, debe limpiar su conjunto de datos antes de usarlo. ¿Por qué limpiar el conjunto de datos? En algunos casos, puede haber valores de celdas vacías o encabezados que no están formateados correctamente, procesando columnas adicionales no deseadas, etc.

Estoy usando los siguientes datos CSV de los que obtengo Kagel Con fines demostrativos.

Player_Id,Player_Name,DOB,Batting_Hand,Bowling_Skill,Country
1,SC Ganguly,8-Jul-72,Left_Hand,Right-arm medium,
2,BB McCullum,27-Sep-81,Right_Hand,Right-arm medium,
3,RT Ponting,19-Dec-74,Right_Hand,Right-arm medium,
4,DJ Hussey,15-Jul-77,Right_Hand,Right-arm offbreak,Australia
5,Mohammad Hafeez,17-Oct-80,,Right-arm offbreak,Pakistan
6,R Dravid,11-Jan-73,,Right-arm offbreak,India
7,W Jaffer,16-Feb-78,,Right-arm offbreak,India
8,V Kohli,5-Nov-88,,Right-arm medium,India
9,JH Kallis,16-Oct-75,,Right-arm fast-medium,South Africa
10,CL White,18-Aug-83,Right_Hand,Legbreak googly,Australia
11,MV Boucher,3-Dec-76,Right_Hand,Right-arm medium,South Africa
12,B Akhil,7-Oct-77,Right_Hand,Right-arm medium-fast,India
13,AA Noffke,30-Apr-77,Right_Hand,Right-arm fast-medium,Australia
14,P Kumar,2-Oct-86,Right_Hand,Right-arm medium,India
15,Z Khan,7-Oct-78,Right_Hand,Left-arm fast-medium,India

1.1.reemplazar celdas vacías

En algunos casos, los archivos CSV no tienen valores en celdas específicas. Eche un vistazo a la captura de pantalla a continuación, hay algunas celdas vacías entre las columnas.

Ejemplo de archivo CSV

Siempre lo reemplazo con «NA» o «Sin valor» para que no haya celdas vacías.Puedes usar lo siguiente awk El fragmento reemplaza las celdas vacías con el valor deseado. En este caso, reemplazaría las celdas vacías con «sin valor».

awk 'BEGIN{FS=",";OFS=","}
    {
      for(i=1;i<=NF;i++)
      {
        if($i == ""){
         $i="No Value"
        }
      }
      print
    }' ~/Downloads/Player.csv > player_cleaned.csv

La forma en que funciona este fragmento es que configuro el separador de campo y el separador de campo de salida en coma (FS=",";OFS=",").utilizar for loopItera sobre cada celda en una fila, si se encuentra que una celda está vacía ($i == "") y luego reemplazarlo con "No value" ($i="No value"). Tienes que redirigir los cambios a un nuevo archivo.

1.2 Títulos en mayúsculas

Los archivos CSV pueden o no tener encabezados. Pero si hay un título, siempre lo uso en mayúsculas para una mejor legibilidad.puedes usarlo awk o sedTe mostraré dos formas.

awk 'BEGIN{FS=",";OFS=","}
    {
        if(NR==1){
            print toupper($0)
        } else {
            print
        }
    }' player.csv > player_cleaned.csv

Aquí estamos comprobando si la línea es la primera usando (NR==1) y use toupper() función para capitalizarlo. El mismo fragmento se puede escribir en una sola línea.

awk 'NR==1{ print toupper($0) }NR>1' player.csv > player_cleaned.csv

utilizar awk, debe redirigir los cambios al nuevo archivo nuevamente. En su lugar, puede utilizar ‘sed‘ Modificar los cambios directamente en el archivo.aquí \U Convertir mayúsculas a minúsculas.Si desea conversión a minúsculas, utilice \L.

$ sed -i -e '1 s/(.*)/\U\1/' player_cleaned.csv
$ cat player_cleaned.csv

1.3 Eliminar las comas finales

Su archivo CSV puede tener una coma al final. Para eliminar las comas finales, puede seguir el siguiente método.

Agregué deliberadamente una coma final a la línea 7 llegar 11 en mi archivo de datos.

Archivo CSV con comas finales
Archivo CSV con comas finales

Para eliminar todas las comas finales, ejecute el siguiente comando sed Pedido:

$ sed -i 's/,$//' ~/Documents/player_cleaned.csv
Eliminar comas finales en archivos CSV
Eliminar comas finales en archivos CSV

Ahora hemos terminado con la parte de limpieza. Es posible que necesite algunos pasos más, pero depende de la estructura de su archivo CSV y de lo que deba limpiarse.

2. Basta con imprimir el archivo CSV en la terminal

Si está tratando de mostrar un archivo CSV en la terminal, hay varias opciones que le permiten imprimir el archivo en formato tabular, lo que le dará una mejor legibilidad.

2.1.comando de columna

La primera forma es usar column Pedido. El comando Columna acepta un delimitador establecido en coma y un delimitador para dividir la columna establecida en tabulador en el siguiente comando. También puede establecer su propio separador personalizado.

$ cat player_cleaned.csv | column -s, -t
$ column -s, -t player_cleaned.csv
Mostrar archivo CSV usando el comando de columna
Mostrar archivo CSV usando el comando de columna

2.2 Comando Buscar CSV

CSVlook es una utilidad que viene con kit csv paquete.No es necesario establecer un separador como lo hacemos nosotros column Pedido.

$ cat player_cleaned.csv | csvlook
$ csvlook player_cleaned.csv
Visualización de archivos CSV con la utilidad Csvlook
Visualización de archivos CSV con la utilidad Csvlook

2.3 Mesas bonitas de Python

si tienes una pitón hermosa El módulo se instala, luego puede ejecutar la siguiente línea y redirigir el archivo CSV para generar la tabla.

python -c "import sys,prettytable; print(prettytable.from_csv(sys.stdin))" < player_cleaned.csv

También puede crear un alias Para una sola línea y pase el nombre del archivo como parámetro.

$ alias ptable="python -c "import sys,prettytable; print(prettytable.from_csv(sys.stdin))""
$ ptable < player_cleaned.csv
Mostrar archivo CSV usando el módulo PrettyTable
Mostrar archivo CSV usando el módulo PrettyTable

3. Obtener datos del archivo CSV

Para obtener el número de columnas en el archivo CSV, ejecute el siguiente comando.variables aquí NF Indica el número de campos separados por comas como delimitadores.

$ awk -F, 'END{print NF}' player_cleaned.csv
6

Para obtener el recuento de filas, ejecute el siguiente comando.variables aquí NR Indica que el registro actual (es decir) cada fila se trata como un registro.

$ awk -F, 'END{print NR}' player_cleaned.csv
16

Para omitir la primera línea (encabezado) y contar el número de líneas, ejecute el siguiente comando.

$ awk -F, 'END{print NR-1}' player_cleaned.csv
15

Esto es muy simple.puedes usarlo cat o awk Imprima todo el archivo CSV.

$ cat player_cleaned.csv
$ awk '{print}' player_cleaned.csv

Imprimir solo los encabezados le dará una buena visión general del tipo de datos que contiene el archivo CSV.puedes usarlo head o awk Comando para agarrar títulos individualmente.

$ head -n 1 player_cleaned.csv
$ awk 'NR==1' player_cleaned.csv

PLAYER_ID,PLAYER_NAME,DOB,BATTING HAND,BOWLING SKILL,COUNTRY

3.4 Excluyendo la fila de encabezado

Para excluir la fila del encabezado e imprimir todas las demás filas, utilice awk Pedido. variables awk NR > 1 Se saltará la primera línea.

$ awk '(NR>1)' player_cleansed.csv
awk - excluir fila de encabezado
awk - excluir fila de encabezado

sed también se puede usar para excluir la primera línea e imprimir todas las demás líneas.Esta 1d flag eliminará la primera línea e imprimirá todas las demás líneas en la salida estándar (terminal).

$ sed 1d < player_cleaned.csv
Sed - excluir fila de encabezado
Sed - excluir fila de encabezado

Podemos usar la posición de la columna para imprimir toda la columna. Hay dos maneras de lograr esto.La primera forma es usar awk El segundo método es utilizar ciclo.awk sería mucho más simple para agarrar la columna.

De forma predeterminada, awk divide la línea según el delimitador y almacena el valor en $1, $2, $3Esperar. El delimitador predeterminado de awk es vacío.

Eche un vistazo al fragmento a continuación, donde el separador de campo (FS=",") y el separador de campo de salida (OFS=",") se establece en una coma. La declaración de impresión imprimirá la primera, segunda y sexta columna.

awk 'BEGIN{FS=",";OFS=","}
    {
        print $1,$2,$6
    }' player_cleansed.csv

También puede escribir el fragmento anterior como una sola línea de código.

awk 'BEGIN{FS=",";OFS=","}{print $1,$2,$6}' player_cleansed.csv
imprimir columnas específicas
imprimir columnas específicas

Ahora la segunda forma es usar un bucle.

IFS="," 
while read -r -a fields
do
    echo ${fields[0]},${fields[1]},${fields[5]}
done < player_cleaned.csv

Déjame explicarte qué sucede exactamente cuando ejecutas el fragmento de código anterior.

  • Establecemos el separador de campo interno IFS en una coma.
  • Usando el comando de lectura, creamos una matriz llamada "campos" y redirigimos el archivo de entrada a while loop.
  • Para cada iteración, leerá fila por fila y almacenará esa fila como un elemento de matriz en un "campo", por lo que puede usar la posición del índice de matriz para obtener una columna específica individualmente.

notas: Los valores del índice comienzan desde 0..N

Si desea imprimir líneas que cumplan con ciertos criterios, puede usar awkVeamos algunos escenarios.

Para imprimir todas las filas que coincidan con los valores de una columna, ejecute el siguiente comando. Aquí estoy tratando de imprimir todas las filas que coinciden con el valor "India" en la columna 6.

$ awk -F , '$6 == "India"' player_cleaned.csv
coincidencia de condiciones
coincidencia de condiciones

Para imprimir todas las líneas que no coincidan con un valor, ejecute el siguiente comando.en lugar de un operador de igualdadestamos usando operador no igual.

$ awk -F , '$6 != "India"' player_cleaned.csv
Condición inversa
Condición inversa

También puede verificar condicionalmente múltiples columnas usando operadores lógicos AND, OR lógicos. Supongamos que quiero verificar todas las filas donde el país es "India" y el bateador es "Right_hand".

aquí, $4 apunta a la columna 4 y $6 Señala la columna 6.símbolo && Se utiliza como operador AND lógico para evaluar dos condiciones.

$ awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv
Comprobaciones de condiciones múltiples
Comprobaciones de condiciones múltiples

Si desea incluir el encabezado con el resultado de la verificación condicional, use el siguiente comando.Primero imprimo la primera línea usando NR==1luego use el operador lógico AND para ejecutar una verificación condicional para imprimir el resultado.

$ awk 'NR==1' player_cleaned.csv && awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv

Si desea imprimir o redirigir la salida, ejecute el comando completo en una subcapa usando soportes.

$ (awk 'NR==1' player_cleaned.csv && awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv) | column -t -s,
Verificación de condición - Incluir encabezados
Verificación de condición - Incluir encabezados

Una nota sobre Csvkit

Todo lo que hemos visto hasta ahora en este artículo es sencillo. Pero cuando su archivo CSV tiene una estructura compleja, analizarlo con el método anterior se vuelve tedioso.Hay una utilidad llamada CSVKITuna gran utilidad para trabajar con archivos CSV en bash.

El problema con la utilidad csvkit es que está instalada por defecto en su distribución y puede que tenga que instalarla manualmente. Es posible que esto no sea posible en su entorno corporativo, ya que puede haber algunas restricciones en la instalación de paquetes externos. Pero esta utilidad merece una mención, y crearemos un artículo detallado por separado para ella.

En conclusión

En esta guía, vimos cómo usar awk, sed para procesar archivos CSV. También puede usar otras utilidades como cut, grep, tr, etc. para obtener los resultados que desea, pero awk y sed le facilitarán la vida y reducirán la complejidad de escribir una gran cantidad de código. Si tiene algún comentario, menciónelo en la sección de comentarios y nos encantaría saber de usted.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba