es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo agregar nuevas líneas en un archivo CSV y modificarlas en Unix?

Soy nuevo en Unix en general y estoy empezando a aprender scripting de shell. Estoy trabajando con un archivo CSV con las siguientes filas de muestra (es un archivo CSV grande con 4 entradas para cada ítem):


Tabla 1
Item ID Tiempo Disponible Ubicación
0001 02/02/2021 08:00 Y NJ
0001 02/02/2021 09:00 N UT
0001 02/02/2021 10:00 Y AZ
0001 02/02/2021 11:00 Y CA
0002 02/02/2021 08:00 Y NJ
0002 02/02/2021 09:00 N UT
0002 02/02/2021 10:00 Y AZ
0002 02/02/2021 11:00 Y CA

Tengo otro CSV con un montón de IDs de ítems de la siguiente manera:


Tabla 2
Item ID Nombre_Item ID_Aux_Item Nombre_Aux_Item
1001 IT_1 3323 IT_Aux_1
1002 IT_2 3325 IT_Aux_2
1003 IT_3 3328 IT_Aux_3
1010 IT_4 3333 IT_Aux_4

Me gustaría crear nuevas entradas en el primer archivo CSV (una entrada para cada ítem en el segundo archivo CSV). Cada nueva entrada debe ser igual a la primera fila de la Tabla 1 con el ID del ítem reemplazado apropiadamente. El resultado esperado sería:


Tabla 1
Item ID Tiempo Disponible Ubicación
0001 02/02/2021 08:00 Y NJ
0001 02/02/2021 09:00 N UT
0001 02/02/2021 10:00 Y AZ
0001 02/02/2021 11:00 Y CA
0002 02/02/2021 08:00 Y NJ
0002 02/02/2021 09:00 N UT
0002 02/02/2021 10:00 Y AZ
0002 02/02/2021 11:00 Y CA
1001 02/02/2021 08:00 Y NJ
1002 02/02/2021 08:00 Y NJ
1003 02/02/2021 08:00 Y NJ
1010 02/02/2021 08:00 Y NJ

¿Cómo puedo escribir un script para lograr esto en Unix? Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto en Unix, puedes utilizar una combinación de comandos de shell y scripting. Aquí hay un enfoque posible:

    1. Lee ambos archivos CSV en variables en tu script de shell utilizando el comando read y la redirección de entrada (<) para leer desde los archivos. Por ejemplo:
    # Leer Tabla 1
    while IFS=, read -r item_id time available location; do
      # procesa cada fila aquí
    done < table1.csv
    
    # Leer Tabla 2
    while IFS=, read -r item_id item_name item_aux_id item_aux_name; do
      # procesa cada fila aquí
    done < table2.csv
    
    1. Inicializa una variable de contador para realizar un seguimiento de las nuevas entradas que estás agregando.
    2. Para cada fila en la Tabla 2, verifica si tiene una fila correspondiente en la Tabla 1 buscando el ID del elemento. Si la tiene, recorre las primeras cuatro filas de la Tabla 1 utilizando un bucle for y reemplaza el ID del elemento con el nuevo ID de la Tabla 2. Luego, imprime la fila modificada. Por ejemplo:

    while IFS=, read -r item_id item_name item_aux_id item_aux_name; do
      encontrado=false
      while IFS=, read -r old_item_id time available location; do
        if [ "$old_item_id" = "$item_id" ]; then
          encontrado=true
          for i in {1..4}; do
            # Reemplaza el ID del elemento con el nuevo ID de la Tabla 2
            if [ "$i" -eq 1 ]; then
              printf "%s," "$item_id"
            else
              printf "%s," "$(echo "$old_item_id,$time,$available,$location" | cut -d, -f$i)"
            fi
          done
          printf "\n"
        fi
      done < table1.csv
      if ! $encontrado; then
        # ID del elemento no encontrado en la Tabla 1, generar nueva entrada
        printf "%s," "$item_id"
        printf "%s," "$(head -n 1 table1.csv | cut -d, -f2-)" # Utilizar primera fila de la Tabla 1
        printf "\n"
      fi
    done < table2.csv
    
    1. La salida del script se puede redireccionar a un nuevo archivo CSV utilizando la redirección de salida (>). Por ejemplo:
    ./script.sh > nueva_tabla1.csv
    

    Esto debería generar un nuevo archivo CSV con la Tabla 1 modificada, incluyendo las entradas adicionales de la Tabla 2.

Comments are closed.