Bash Script: Problema com variáveis ​​do arquivo csv

Bash Script: Problema com variáveis ​​do arquivo csv

Estou tendo um pequeno problema para obter variáveis ​​de um arquivo csv em minha máquina Linux e usá-las em um arquivo if. Eu tenho o seguinte csv:

Name;Age
Marc;18
Joseph;10

Estou tentando obter essas informações do meu csv para usar em uma função:

Meu 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)

Depois de executar meu código, recebo:

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

Eu estava esperando:

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

Já tentei muitas coisas sem sucesso. Posso usar c_1e c_2como entrada para algumas funções sem problemas. O problema é justamente quando tento fazer operações matemáticas.

Se eu fizer:

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

ele retorna:

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

Mesmo problema usando d=$(("${c_2}+1")).

O que devo mudar para fazê-lo funcionar? Usar #!/bin/kshou #!/bin/shme #!/bin/bashdá os mesmos resultados.

Obrigado pela ajuda :)

Responder1

Seu primeiro problema é que você está usando um arquivo de texto do Windows. Seu csv possui terminações de linha no estilo Windows ( \r\n). Você pode corrigir isso usando:

dos2unix teste_input.csv

Ou se você não tiver dos2unixinstalado, basta fazer:

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

Isso fará com que seu código produza a saída que você espera. Quase:

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

O que $c_1existe por causa das aspas simples nesta linha:

echo '$c_1 can drive'

As variáveis ​​não são expandidas entre aspas simples, por isso você vê $c_1e não o valor da variável. Você precisa:

echo "$c_1 can drive"

A próxima questão é ==para comparação de strings e não para aritmética. Funcionará aqui, mas se quiser comparar valores numéricos, você deseja -eq:

if [ $c_2 -eq "18" ]

No entanto, com base na saída "can drive", suspeito que você queira verificar se o valor da variável é igual ou maior que 18, então você usaria -ge:

 if [ $c_2 -ge "18" ]

Finalmente, você precisa escolher um shell para usar. kshnão é o mesmo que bashque não é o mesmo que sh. Embora tenham uma sintaxe extremamente semelhante, ela não é idêntica e algumas coisas funcionarão de maneira diferente dependendo do que você usar. Por exemplo, shnão suporta <(command).

Quanto à aritmética que você tentou, você só precisa acertar a sintaxe, você precisa usar um "contexto aritmético". s=$c_2+1está apenas fazendo uma simples atribuição de variável. É definir o valor da variável $spara o valor de $c_2com ocorda +1adicionado:

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

Seu segundo exemplo d=$((${c_2}+1))funciona, porque (( ))define um contexto aritmético:

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

Você recebeu o erro de sintaxe por causa dos finais de linha do Windows:

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

Então isso desaparecerá se você corrigir o arquivo como descrevi no início.

informação relacionada