Comparando com o valor do arquivo csv

Comparando com o valor do arquivo csv

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 é falsee 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 awko 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 $NFlá 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, odmas vamos mantê-lo simples e usado cate, sedneste caso:

cat -vEt file.csvoused -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 trargumento (insira-o digitando ctrlVseguido de Return. Ele será exibido como tr -d ' ^M'.

informação relacionada