私は非常に大きな一行のテキストファイルを解析してデータベースに保存するという任務を担当しています。このファイルには大容量(48GB)のテキストデータが含まれており、次の形式で私に提供されます。
col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&col1*#(%&col2*#(%&col3*#(%&col4...
したがって、ファイルの区切り文字は "*#(%&") で、列はデフォルトで 1 行の col1-col5 で繰り返されます。
私の目標は、これを次のレコード様式に変換することです。
col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&
col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&
col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&
だから私は5つの「*#(%&」」の後に「\ n」を追加したいと思いました。もの:
sed -r 's/([^\*#\(%\&|]*\*#\(%\&){5}/&\n/g'
ただし、ほとんどの場合、これはcol4が巨大なテキストフィールドであるために機能し、colに単一の文字を含むレコードの場合'#(%&' つまり '#'、カウントがリセットされているようで、必要に応じて動作しません。この問題が発生しないように調整または防止する方法はありますか? ' The 正確なモード#(%&' 表示されます。
ベストアンサー1
GNUを使用すると、awk
次のことができます。
gawk -v RS='\\*#\\(%&' -v ORS= '{print $0 RT};NR%5 == 0{printf "\n"}'
以下を使用しますsed
(ただし、一部のsed
実装では行サイズの制限が低くなります)。
sed 's/*#(%&/&\
/5;P;D'