Eu tenho um arquivo csv e preciso comparar o valor na 4ª coluna da 2ª linha com uma string.
Exemplo de arquivo csv:
Col1,Col2,Col3,Col4
Val1,Val2,Val3,ValNeeded
Estou usando o código abaixo para fazer isso,
varcsv=`sed '2q;d' file.csv | cut -d',' -f4 | tr -d ' '`
myvar=ValNeeded
if [ "$varcsv" = "$myvar" ]; then
echo "true"
else
echo "false"
fi
A saída deste código é false
e o comprimento varcsv
é 10
(mesmo o comprimento está incorreto).
Informe-me onde a alteração é necessária.
Responder1
Embora eu tenha postado minha resposta como um comentário e os comentários tenham sido removidos, vamos tentar novamente:
A maneira como você está abordando isso é boa, mas pode ser melhorada de forma que você não precise depender de muitos binários externos. Por exemplo, para resolver seu problema você pode usar awk
o seguinte:
awk -F, -vmyvar="ValNeeded" 'NR==2 { if ($4 == myvar) print "match"; else print "No match"}' file.csv
Se você quiser manter seu código, mas reescrevê-lo um pouco, ficaria assim:
#!/bin/bash
varcsv=$(awk -F, 'NR==2 { print $NF }' file.csv)
myvar=ValNeeded
if [[ $varcsv == "$myvar" ]]; then
echo "true"
else
echo "false"
fi
O $NF
lá obtém o último campo do registro.
Como já foi mencionado por Philippos, seu arquivo contém finais de linha do MSDOS, também conhecidos como CR/LF. Você pode verificá-los de diferentes maneiras usando, cat
, e muitas outras ferramentas sed
, od
mas vamos mantê-lo simples e usado cat
e, sed
neste caso:
cat -vEt file.csv
oused -n l file.csv
Isso retornará algo como:
Val1,Val2,Val3,SomeVar^M$
Val1,Val2,Val3,ValNeeded^M$
Val1,Val2,Val3,Ignorevar^M$
$
Para remover ^M$
todos esses caracteres, você pode usar alguns utilitários. Por exemplo:
dos2unix file.csv
. Existem outras maneiras de fazer isso no editor, mas isso requer mais esforço.
Depois de converter o arquivo, você deve estar bem.
Responder2
Este é um problema típico com arquivos que possuem finais de linha MSDOS (retorno de carro + avanço de linha). O retorno de carro é invisível, mas fará parte da string a ser comparada.
Você já descobriu que o comprimento está errado e suponho que sua tr -d ' '
intenção era remover um espaço à direita, mas o problema não era um espaço em branco. Basta adicionar um retorno de carro ao seu tr
argumento (insira-o digitando ctrlVseguido de Return. Ele será exibido como tr -d ' ^M'
.