Я работаю над длинным скриптом на Bash. Я хочу читать ячейки из файла CSV в переменные Bash. Я могу разбирать строки и первый столбец, но не любой другой столбец. Вот мой код:
cat myfile.csv|while read line
do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"
done
Он печатает только первый столбец. В качестве дополнительного теста я попробовал следующее:
read -d, x y < <(echo a,b,)
И $ y пусто. Итак, я попробовал:
read x y < <(echo a b)
И $ y есть b
. Зачем?
awk
использование$1
,$2
и т.д.?Ответы:
Вам нужно использовать
IFS
вместо-d
:Обратите внимание, что для общего анализа CSV вы должны использовать специализированный инструмент, который может обрабатывать поля в кавычках с внутренними запятыми, среди других проблем, которые Bash не может решить самостоятельно. Примеры таких инструментов:
cvstool
иcsvkit
.источник
command not found
. Толькоecho
работает.;
:while IFS=";" read col1 col2; do ...
${var}
), но я опускаю их, когда они не нужны. Мне это кажется чище.Со
man
страницы:Вы используете,
-d,
который завершит строку ввода запятой. Он не будет читать остальную часть строки. Вот почему $ y пусто.источник
Мы можем анализировать CSV-файлы с помощью строк в кавычках и разделенных с помощью say | со следующим кодом
awk преобразует строковые поля в переменные, а tr удаляет кавычки.
Немного медленнее, так как awk выполняется для каждого поля.
источник
Если вы хотите прочитать CSV-файл с несколькими строками, это решение.
источник