Прочитанные аргументы, разделенные новой строкой

Я тестировал это с помощью GNU awk и sed ... не уверен, будет ли это с другими версиями.

awk -F, '{printf "'\''%s'\'' : '\''%s'\'', ", $1, $2} END {print "}" }' input.csv | sed -e 's/^/{/' -e 's/, }/}/' > output.json
0
22.11.2018, 09:30
3 ответа

Если речь идет об обработке текста, то наиболее очевидным является использование 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
4
28.01.2020, 02:16

Я предлагаю вам использовать чтение с опцией -d, которая принимает многострочный -ввод пользователя.

или используйте tr '\n' ' 'для перевода новой строки в пробел, это хакерство.

Я не знаю, как это сделать, но вы можете использовать tr для перевода EOF в новую строку, чтобы он идеально соответствовал вашим ожиданиям.

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

1
28.01.2020, 02:16

Если (по какой-то причине )вы хотите собрать все входные строки в массив, в bash вы используете

readarray -t input_lines

, а затем каждая строка сохраняется как элемент индексированного массива input_lines. -tдолжен отделить новую строку от каждой строки.

0
28.01.2020, 02:16

Теги

Похожие вопросы