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
これは、フィールドの並べ替えやその他の処理の柔軟性を提供する実装の 1 つです。
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
申し訳ありませんが、それに抵抗できませんでした。:)