Сравнение со значением файла CSV

Сравнение со значением файла CSV

У меня есть CSV-файл, и мне нужно сравнить значение в 4-м столбце 2-й строки со строкой.

Пример CSV-файла:

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

Для этого я использую следующий код:

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

myvar=ValNeeded

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

Вывод этого кода равен , falseа длина varcsvравна 10(даже длина неверна).

Пожалуйста, дайте мне знать, где требуется внести изменения.

решение1

Хотя я опубликовал свой ответ в виде комментария и комментарии были удалены, давайте попробуем еще раз:

Ваш подход хорош, но его можно улучшить таким образом, что вам не понадобится зависимость от слишком большого количества внешних двоичных файлов. Например, чтобы решить вашу проблему, вы можете использовать awkследующее:

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

Если вы хотите сохранить свой код, но немного его переписать, то он будет выглядеть так:

#!/bin/bash

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

Там $NFнаходится последнее поле в записи.

Как уже упоминал Филиппос, ваш файл содержит окончания строк MSDOS, также известные как CR/LF. Вы можете проверить их разными способами, используя, cat, sed, odи многие другие инструменты, но давайте не будем усложнять и использовать catи sedв этом случае:

cat -vEt file.csvилиsed -n l file.csv

Это вернет что-то вроде:

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

Чтобы удалить ^M$все эти символы вместе, вы можете использовать некоторые утилиты. Например: dos2unix file.csv. Есть и другие способы сделать это из редактора, но это требует больше усилий.

После конвертации файла все должно быть хорошо.

решение2

Это типичная проблема с файлами, имеющими окончания строк MSDOS (возврат каретки + перевод строки). Возврат каретки невидим, но будет частью строки для сравнения.

Вы уже обнаружили, что длина неверна, и я предполагаю, что вы tr -d ' 'намеревались удалить завершающий пробел, но проблема была не в пробеле. Просто добавьте возврат каретки к вашему trаргументу (введите его, набрав , ctrlVа затем Return. Он будет показан как tr -d ' ^M'.

Связанный контент