Vergleichen mit dem Wert einer CSV-Datei

Vergleichen mit dem Wert einer CSV-Datei

Ich habe eine CSV-Datei und muss den Wert in der 4. Spalte der 2. Zeile mit einer Zeichenfolge vergleichen.

Beispiel einer CSV-Datei:

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

Ich verwende den folgenden Code, um dies durchzuführen,

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

myvar=ValNeeded

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

Die Ausgabe dieses Codes ist falseund die Länge varcsvist 10(auch die Länge ist falsch).

Bitte teilen Sie mir mit, wo die Änderung erforderlich ist.

Antwort1

Obwohl ich meine Antwort als Kommentar gepostet habe und Kommentare entfernt wurden, versuchen wir es noch einmal:

Ihr Ansatz ist in Ordnung, kann aber so verbessert werden, dass Sie nicht mehr von zu vielen externen Binärdateien abhängig sind. Um Ihr Problem zu lösen, können Sie beispielsweise awkFolgendes verwenden:

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

Wenn Sie Ihren Code behalten, aber leicht umschreiben möchten, würde er folgendermaßen aussehen:

#!/bin/bash

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

Dort $NFwird das letzte Feld im Datensatz abgerufen.

Wie bereits von Philippos erwähnt, enthält Ihre Datei MSDOS-Zeilenenden, auch bekannt als CR/LF. Sie können diese auf verschiedene Weise mit, cat, sed, odund vielen anderen Tools überprüfen, aber halten wir es einfach und verwenden in diesem Fall catund :sed

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

Das Ergebnis ist etwa:

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

Um diese ^M$Zeichen vollständig zu entfernen, können Sie einige Dienstprogramme verwenden. Beispiel: dos2unix file.csv. Es gibt andere Möglichkeiten, dies innerhalb des Editors zu tun, aber das erfordert mehr Aufwand.

Sobald Sie die Datei konvertiert haben, sollte alles gut sein.

Antwort2

Dies ist ein typisches Problem bei Dateien mit MSDOS-Zeilenenden (Wagenrücklauf + Zeilenvorschub). Der Wagenrücklauf ist unsichtbar, wird aber Teil der zu vergleichenden Zeichenfolge sein.

Sie haben bereits festgestellt, dass die Länge falsch ist, und ich nehme an, Sie tr -d ' 'wollten eigentlich ein Leerzeichen am Ende entfernen, aber das Problem war kein Leerzeichen. Fügen Sie Ihrem Argument einfach einen Wagenrücklauf hinzu (geben Sie ihn ein, indem Sie gefolgt von treingeben . Es wird als angezeigt .ctrlVReturntr -d ' ^M'

verwandte Informationen