您是否知道COPY FROM 允许您指定要导入哪些列(以及它们的顺序)?
COPY tablename ( column1, column2, ... ) FROM ...
在 Postgres 级别直接指定要导入的列和顺序,通常是最快和最有效的导入方法。
话虽如此,使用sed(比其他帖子中介绍的方法)到replace an n th occurrence 有一种更简单(且可移植)的方式,例如用双逗号替换第 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 和 -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
抱歉,忍不住了。 :)