私は巨大な(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