У меня есть 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'
.