Estoy trabajando en un largo guión de Bash. Quiero leer celdas de un archivo CSV en variables Bash. Puedo analizar líneas y la primera columna, pero no cualquier otra columna. Aquí está mi código hasta ahora:
cat myfile.csv|while read line
do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"
done
Solo imprime la primera columna. Como prueba adicional, probé lo siguiente:
read -d, x y < <(echo a,b,)
Y $ y está vacío. Así que intenté:
read x y < <(echo a b)
Y $ y lo es b
. ¿Por qué?
awk
utilizar$1
,$2
etc?Respuestas:
Necesita usar en
IFS
lugar de-d
:Tenga en cuenta que para el análisis de CSV de propósito general, debe usar una herramienta especializada que pueda manejar los campos entre comillas con comas internas, entre otros problemas que Bash no puede manejar por sí mismo. Ejemplos de tales herramientas son
cvstool
ycsvkit
.fuente
command not found
. Solo lasecho
obras.;
:while IFS=";" read col1 col2; do ...
${var}
. Ej. ), Pero las omito cuando no son necesarias. Para mí, parece más limpio.De la
man
pagina:Está utilizando
-d,
que terminará la línea de entrada en la coma. No leerá el resto de la línea. Por eso $ y está vacío.fuente
Podemos analizar archivos csv con cadenas entre comillas y delimitados por say | con el siguiente código
awk analiza los campos de cadena en variables y tr elimina la cita.
Ligeramente más lento a medida que se ejecuta awk para cada campo.
fuente
Si desea leer un archivo CSV con algunas líneas, esta es la solución.
fuente