Поскольку вы имеете дело с записями, 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.