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