Поскольку вы имеете дело с записями, awk имеет больше смысла. Тем не менее, это не очень хорошо в CSV, так как разделители полей несколько изменчивы. Но если вы уверены, что все поля заключены в двойные кавычки, это будет работать:
awk -F'","' 'BEGIN {OFS=";"} { gsub(/(^")|("$)/, ""); $1=$1; print }'
Это устанавливает разделитель входного поля в awk на " "," " (включая внутренний набор двойных кавычек). Это почти работает, за исключением того, что вам приходится иметь дело с ведущими и конечными двойными кавычками, которые удаляются с помощью функции gsub . $1=$1 заставляет его перекомпилировать запись с новым разделителем выходного поля, который был определен как ; в блоке BEGIN. Затем print распечатайте всю запись.
Это немного аккуратнее:
awk -F '(^")|(",")|("$)' 'BEGIN {OFS=";"} { $1=$1; print }'
Он устанавливает в качестве разделителя поля ввода регулярное выражение, которое включает в себя двойные кавычки в начале и конце записи, но также заставляет его печатать пустое поле начала и конца поля. Вы можете легко избавиться от конечного поля:
awk -F '(^")|(",")|("$)' 'BEGIN {OFS=";"} { NF=NF-1; $1=$1; print }'
NF - это число полей, и уменьшение его на единицу отрывает от последнего поля. Но я не могу придумать, как отрубить первое поле.
Если вы знаете, что у ввода всегда есть пять полей, вы можете сделать это:
awk -F '(^")|(",")|("$)' 'BEGIN {OFS=";"} { print $2,$3,$4,$5,$6 }'
Обратите внимание, что это избавляет от конструкции $1=$1 , которая нам нужна, только если мы печатаем (подразумевается) $ 0.
Все это говорит о том, что я, вероятно, в конечном итоге использовал Perl и один из многих доступных модулей CSV на CPAN.