巨大な(70GB)1行のテキストファイルで文字列を置き換える

巨大な(70GB)1行のテキストファイルで文字列を置き換える

私は巨大な(70GB)を持っています。一行、文字列(トークン)を置き換えるテキストファイル。<unk>トークンを別のダミートークンに置き換えたい(手袋の問題)。

私は試しましたsed

sed 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new

しかし、出力ファイルcorpus.txt.newには0バイトがあります!

私もPerlを使ってみました。

perl -pe 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new

ところで、メモリ不足エラーが発生しました。

小さいファイルの場合、上記の両方のコマンドが機能します。

このようなファイルの文字列をどのように変更できますか? これ関連質問ですが、答えのどれも私には効果的ではありませんでした。

編集する:ファイルを10GB(または他の)サイズのチャンクに分割し、sed各チャンクに適用してからマージするのはどうですかcat?馬になる?よりエレガントなソリューションはありますか?

ベストアンサー1

これらの大容量ファイルにはFlexを使用できます。設定unk.l:

%%
\<unk\>     printf("<raw_unk>");  
%%

その後、コンパイルして実行します。

$ flex -o unk.c  unk.l
$ cc -o unk -O2 unk.c -lfl
$ unk < corpus.txt > corpus.txt.new

おすすめ記事