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.

Soy un traductor de español que se encarga de traducir documentos de tecnología de la información (TI). Aquí tienes la traducción al español: Reemplaza la barra vertical con una coma, excepto cuando se encuentra entre llaves curvas en un archivo CSV en bash.

Necesito alguna solución para reemplazar el pipe por la coma en una columna específica de un archivo CSV, que también tiene algunos valores clave separados por pipe (puede ser uno o más).

Básicamente, necesito reemplazar el pipe que no está dentro de llaves simplemente, es decir, {subStringX441|subStringX442|subStringX443|subStringX444} debe permanecer tal cual.

No puedo usar simplemente sed -i -e 's|\,\g' filename ya que reemplazará todos los pipes.

Entrada:

column1,column2,column3,column4,column5,column6,column7
stringX1,stringX2,stringX3,stringX41|stringX42|stringX43|stringX44={subStringX441|subStringX442|subStringX443|subStringX444}|stringX45,stringX5,stringX6,stringX7
stringY1,stringY2,stringY3,stringY41|stringY42|stringY43|stringY44={subStringY441|subStringY442|subStringY443}|stringY45,stringY5,stringY6,stringY7

Resultado deseado:

column1,column2,column3,column4a,column4b,column4c,column4d,column4e,column5,column6,column7
stringX1,stringX2,stringX3,stringX41,stringX42,stringX43,stringX44={subStringX441|subStringX442|subStringX443|subStringX444},stringX45,stringX5,stringX6,stringX7
stringY1,stringY2,stringY3,stringY41,stringY42,stringY43,stringY44={subStringY441|subStringY442|subStringY443},stringY45,stringY5,stringY6,stringY7
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución en bash podría ser usar awk para recorrer cada columna del archivo CSV y reemplazar las tuberías por comas solo si no están dentro de llaves. Aquí hay un ejemplo de comando que debería lograr el resultado deseado:

    awk -F, '{
      for(i=1; i<=NF; i++) {    # recorrer cada columna
        if ($i ~ /^{.*}$/) {    # comprobar si la columna contiene llaves
          printf "%s%s", $i, (i==NF ? "\n" : FS)    # imprimir columna sin modificar
        }
        else {
          gsub(/\|/, ",", $i)  # reemplazar tuberías por comas
          printf "%s%s", $i, (i==NF ? "\n" : FS)    # imprimir columna modificada
        }
      }
    }' input.csv > output.csv
    

    Este comando establece el separador de campos como coma (-F,) y utiliza un bucle for para iterar a través de cada campo (columna) del archivo CSV de entrada. Luego verifica si el campo contiene llaves usando una expresión regular para hacer coincidir el inicio (^) y el final ($) del campo con un patrón de cualquier carácter (.) entre dos llaves ({.*}). Si el campo contiene llaves, imprime el campo sin modificaciones.

    Si el campo no contiene llaves, utiliza la función gsub para sustituir globalmente (gsub) las tuberías (\|) por comas (,) dentro del campo ($i). Finalmente, imprime el campo modificado con printf y agrega un separador de comas (FS) entre los campos, excepto para el último campo donde agrega un carácter de nueva línea (\n) en su lugar.

    La salida se redirige a un nuevo archivo llamado output.csv utilizando el operador >.

Comments are closed.