Comparando con el valor del archivo csv

Comparando con el valor del archivo csv

Tengo un archivo csv y necesito comparar el valor de la cuarta columna de la segunda fila con una cadena.

Archivo csv de muestra:

Col1,Col2,Col3,Col4
Val1,Val2,Val3,ValNeeded

Estoy usando el siguiente código para realizar esto,

varcsv=`sed '2q;d' file.csv | cut -d',' -f4 | tr -d ' '`

myvar=ValNeeded

if [ "$varcsv" = "$myvar" ]; then
    echo "true"
else
    echo "false"
fi

La salida de este código es falsey la longitud varcsves 10(incluso la longitud es incorrecta).

Por favor, hágame saber dónde se requiere el cambio.

Respuesta1

Si bien publiqué mi respuesta como comentario y se eliminaron los comentarios, démosle otra oportunidad:

La forma en que lo está abordando está bien, pero se puede mejorar de tal manera que no necesite depender de demasiados binarios externos. Por ejemplo, para resolver su problema puede utilizar awklo siguiente:

awk -F, -vmyvar="ValNeeded" 'NR==2 { if ($4 == myvar) print "match"; else print "No match"}'  file.csv

Si desea conservar su código pero reescribirlo ligeramente, se vería así:

#!/bin/bash

varcsv=$(awk -F, 'NR==2 { print $NF }' file.csv)
myvar=ValNeeded
if [[ $varcsv == "$myvar" ]]; then
    echo "true"
else
    echo "false"
fi

Allí $NFobtiene el último campo del registro.

Como ya mencionó Philippos, su archivo contiene finales de línea de MSDOS, también conocidos como CR/LF. Puede verificarlos de diferentes maneras usando, cat, y muchas otras herramientas sed, odpero mantengámoslo simple y utilícelo caten sedeste caso:

cat -vEt file.csvosed -n l file.csv

Esto devolverá algo como:

Val1,Val2,Val3,SomeVar^M$
Val1,Val2,Val3,ValNeeded^M$
Val1,Val2,Val3,Ignorevar^M$
$

Para eliminar ^M$todos estos caracteres, puede utilizar algunas utilidades. Por ejemplo: dos2unix file.csv. Hay otras formas de hacerlo desde el editor, pero eso requiere más esfuerzo.

Una vez que haya convertido el archivo, debería estar bien.

Respuesta2

Este es un problema típico con archivos que tienen finales de línea MSDOS (retorno de carro + avance de línea). El retorno de carro es invisible, pero será parte de la cadena a comparar.

Ya descubrió que la longitud es incorrecta y supongo que su tr -d ' 'intención era eliminar un espacio final, pero el problema no era un espacio en blanco. Simplemente agregue un retorno de carro a su trargumento (ingréselo escribiendo ctrlVseguido de Return. Se mostrará como tr -d ' ^M'.

información relacionada