Bash Script: problema con variables del archivo csv

Bash Script: problema con variables del archivo csv

Tengo un pequeño problema para obtener variables de un archivo csv en mi máquina Linux y usarlas en un archivo if. Tengo el siguiente csv:

Name;Age
Marc;18
Joseph;10

Estoy intentando obtener esta información de mi csv para usarla en una función:

Mi código bash:

#!/bin/ksh

while IFS=";" read -r c_1 c_2 

do
  echo "Name : $c_1"
  echo "Age : $c_2"
   
if [ $c_2 == "18" ]
then
    echo "$c_1 can drive"
fi

done < <(tail -n +2 teste_input.csv)

Después de ejecutar mi código, obtengo:

Name : Marc
Age : 18
Name : Joseph
Age : 10

Yo estaba esperando:

Name : Marc
Age : 18
Marc can drive
Name : Joseph
Age : 10

Ya probé muchas cosas sin éxito. Puedo usar c_1y c_2como entrada para algunas funciones sin ningún problema. El problema es justo cuando intento hacer operaciones matemáticas.

Si lo hago:

s=$c_2+1
d=$((${c_2}+1))

vuelve :

+1
+1")syntax error: invalid arithmetic operator (error token is "

El mismo problema al usar d=$(("${c_2}+1")).

¿Qué debo cambiar para que funcione? Usar #!/bin/ksh, #!/bin/sho #!/bin/bashme da los mismos resultados.

Gracias por tu ayuda :)

Respuesta1

Su primer problema es que está utilizando un archivo de texto de Windows. Su csv tiene finales de línea al estilo de Windows ( \r\n). Puedes arreglar eso usando:

dos2unix teste_input.csv

O si no lo tienes dos2unixinstalado, simplemente haz:

sed -i 's/\r//g' teste_input.csv

Eso hará que su código produzca el resultado que espera. Casi:

$ foo.sh teste_input.fixed.csv 
Name : Marc
Age : 18
$c_1 can drive
Name : Joseph
Age : 10

Esto $c_1se debe a las comillas simples en esta línea:

echo '$c_1 can drive'

Las variables no se expanden entre comillas simples, por eso se ve $c_1y no el valor de la variable. Necesitas:

echo "$c_1 can drive"

El siguiente problema es que ==se trata de comparación de cadenas y no de aritmética. Funcionará aquí, pero si desea comparar valores numéricos, desea -eq:

if [ $c_2 -eq "18" ]

Sin embargo, según su resultado de "puede conducir", sospecho que desea verificar si el valor de la variable es igual o mayor que 18, por lo que usaría -ge:

 if [ $c_2 -ge "18" ]

Finalmente, debes elegir un caparazón para usar. kshno es lo mismo que bashcual no es lo mismo que sh. Si bien tienen una sintaxis extremadamente similar, no es idéntica y algunas cosas funcionarán de manera diferente dependiendo de lo que uses. Por ejemplo, shno es compatible <(command).

En cuanto a la aritmética que probó, sólo necesita obtener la sintaxis correcta, necesita usar un "contexto aritmético". s=$c_2+1solo está haciendo una simple asignación de variable. Es establecer el valor de la variable $sal valor de $c_2con elcadena +1agregado:

$ c_2=10
$ s=$c_2+1
$ echo "$s"
10+1

Su segundo ejemplo d=$((${c_2}+1))funciona porque (( ))establece un contexto aritmético:

$ c_2=10
$ d=$((${c_2}+1))
$ echo "$d"
11

Obtuviste el error de sintaxis debido a los finales de línea de Windows:

$ c_2=10$'\r'
$ d=$((${c_2}+1))
+1")syntax error: invalid arithmetic operator (error token is "

Eso desaparecerá si arregla el archivo como lo describí al principio.

información relacionada