Вам известно о том, что COPY FROM
позволяет вам указать, какие столбцы (а также в каком порядке они) должны быть импортированы?
COPY tablename ( column1, column2, ... ) FROM ...
Указание непосредственно, на уровне Postgres, какие столбцы импортировать и в каком порядке, как правило, будет самым быстрым и наиболее эффективным методом импорта.
С учетом вышесказанного, существует гораздо более простой (и переносимый) способ использования sed
(чем то, что было представлено в других постах) для замены n -го вхождения например замените 4-е и 5-е вхождения запятой на двойные запятые:
echo '1,23,56,we,89,2009-12-06' | sed -e 's/,/,,/5;s/,/,,/4'
производит:
1,23,56,we,,89,,2009-12-06
Обратите внимание, что сначала я заменил самые правые поля (# 5).
Я вижу, что вы также пометили свой вопрос как perl
связанный, хотя вы не даете явной ссылки на perl
в основной части вопроса; Вот одна из возможных реализаций, которая дает вам гибкость в переупорядочении или другой обработке полей:
echo '1,23,56,we,89,2009-12-06' |
perl -F/,/ -nae 'print "$F[0],$F[1],$F[2],$F[3],,$F[4],,$F[5]"'
также производит:
1,23,56,we,,89,,2009-12-06
Очень похоже на awk
, для записи:
echo '1,23,56,we,89,2009-12-06' |
awk -F, '{print $1","$2","$3","$4",,"$5",,"$6}'
Я оставлю Python кому-то еще. :)
Небольшое примечание на примере Perl: я использую опции -a
и -F
для автоматического разделения, поэтому у меня есть более короткая командная строка; однако, это оставляет новую строку встроенной в последнее поле ($F[5]
), что хорошо, если это поле не нужно переупорядочивать где-либо еще. В случае возникновения такой ситуации потребуется немного больше ввода, чтобы убрать новую строку с помощью chomp
, затем split
вручную и, наконец, напечатать наш собственный символ новой строки \n
(в приведенном выше примере awk
такой проблемы нет ):
perl -ne 'chomp;@F=split/,/;print "$F[0],$F[1],$F[2],$F[3],,$F[4],,$F[5]\n"'
РЕДАКТИРОВАТЬ (идея, вдохновленная Вивином):
COMMAS_TO_DOUBLE="1 4 5"
echo '1,23,56,we,89,2009-12-06' |
sed -e `for f in $COMMAS_TO_DOUBLE ; do echo "s/,/,,/$f" ; done |
sort -t/ -k4,4nr | paste -s -d ';'`
1,,23,56,we,,89,,2009-12-06
Извините, не смог устоять. :)