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 false
y la longitud varcsv
es 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 awk
lo 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í $NF
obtiene 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
, od
pero mantengámoslo simple y utilícelo cat
en sed
este caso:
cat -vEt file.csv
osed -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 tr
argumento (ingréselo escribiendo ctrlVseguido de Return. Se mostrará como tr -d ' ^M'
.