固定数の複数文字区切り記号の後に「\ n」を追加します。

固定数の複数文字区切り記号の後に「\ n」を追加します。

私は非常に大きな一行のテキストファイルを解析してデータベースに保存するという任務を担当しています。このファイルには大容量(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'

答え2

perl -F'\*#\(%&' -lane 'print join "*#(%&", splice @F, 0, 5 while @F'

布材:

 ° Split on the string `*#(%&`  it is stored in the array @F.
 ° Then, while the array still has elements in it, pluck out the leading 5, or whatever are left in the last gasp, and join these with the same string they were split on. And this is printed to stdout followed by a newline which is ensured by the `-l` option. 

関連情報