Я тестировал это с помощью GNU awk
и sed
... не уверен, будет ли это с другими версиями.
awk -F, '{printf "'\''%s'\'' : '\''%s'\'', ", $1, $2} END {print "}" }' input.csv | sed -e 's/^/{/' -e 's/, }/}/' > output.json
Если речь идет об обработке текста, то наиболее очевидным является использование awk
, специально предназначенного для этого (, хотя также можно использовать perl
или sed
)
awk -F, '{print "something with "$1" and "$2}'
Если ввод является фактическим CSV, который может иметь более сложные значения, такие как:
"field, with comma", "and with
newline", "or ""quotes"""
Вы можете использовать perl
или python
или некоторые специализированные утилиты для разбора CSV.
Если поля должны быть доступны как переменные оболочки, потому что, например, вам нужно запустить некоторые определенные команды с этими полями в качестве аргументов, вы должны сделать что-то вроде:
while IFS=, read -r a b rest; do
something-with "$a" "$b"
done
См. также GNU parallel
для параллельной работы:
PARALLEL_SHELL=sh parallel -C, 'something-with {1} {2}'
Но имейте в виду, что GNU parallel
создает значительные накладные расходы, поэтому распараллеливание должно того стоить.
Оболочка ksh93
может фактически понимать формат CSV (обрабатывать кавычки отдельных полей, как в сложном примере выше)
while IFS=, read -rS a b rest; do
do-something-with "$a" "$b"
done
Я предлагаю вам использовать чтение с опцией -d, которая принимает многострочный -ввод пользователя.
или используйте tr '\n' ' '
для перевода новой строки в пробел, это хакерство.
Я не знаю, как это сделать, но вы можете использовать tr для перевода EOF в новую строку, чтобы он идеально соответствовал вашим ожиданиям.
не стесняйтесь комментировать, если вам нужно больше деталей.
Если (по какой-то причине )вы хотите собрать все входные строки в массив, в bash вы используете
readarray -t input_lines
, а затем каждая строка сохраняется как элемент индексированного массива input_lines
. -t
должен отделить новую строку от каждой строки.