您是否知道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
-related,尽管您在问题正文中没有明确提及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
and-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"'
编辑(受 Vivin 启发的想法):
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
对不起,无法抗拒。:)