大きな1行ファイルの基本的なsedコマンド:メモリを再割り当てできませんでした


10

250 MBのテキストファイルがすべて1行にあります。

このファイルで、a文字をb文字に置き換えます。

sed -e "s/a/b/g" < one-line-250-mb.txt

それは失敗します:

sed: couldn't re-allocate memory

この種のタスクは、多くのメモリを割り当てずにインラインで実行できるように思えます。
仕事のためのより良いツール、またはより良い使用方法はありますsedか?


GNU sedバージョン4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM



4
その質問は、非常に複雑な複数行式に関するものです。私の質問は、あなたが想像できる最も基本的な表現についてです。
Nicolas Raoul

@RubanSavvyに加えて、他のQの回答はどちらも長い行を考慮に入れておらず、実際には両方ともおそらく同じ問題を抱えているでしょう。
terdon

このQにsedバージョンと、ハードウェア情報(具体的にはRAM)とディストリビューションバージョンを含めることはできますか?
slm

回答:


10

はい、tr代わりに使用してください:

tr 'a' 'b' < file.txt > output.txt

sedラインで取引するため、巨大なラインは問題を引き起こします。私はそれが行を保持するために内部的に変数を宣言していて、あなたの入力がその変数に割り当てられた最大サイズを超えていると思います。

tr 一方、文字を扱い、任意の長い行を正しく処理できるはずです。


不思議なことに、「abcabc ...」で満たされた250MBのファイルを作成したところsed -e "s/a/z/g" b.txt > c.txt、問題なく実行できました。sed(GNU sed)の使用4.2.2。
slm

@slmはここで496Mファイルと同じsedバージョンで同じですが、実装またはハードウェアに依存すると思います。
terdon

ええ、私が推測しなければならないのであれば、我々は古いバージョンのを扱っていますsed
slm

5

sedとawkの過去のバージョンにはメモリの問題がありましたが、最近のバージョンではほとんどが修正されていますが、この問題の古典的な発生の1つがLarry Wallにかなりの打撃を与えました。彼の答えは、新しいプログラミング言語を書くことでした-ハードウェア以外のメモリ制限はありません。彼はそれをperlと呼んだ。特定の問題はより簡単に解決できますが、私が使用する一般的な経験則は、sedがperlを使用しない場合です。

編集:例をリクエストして:

perl -pe "s/a/b/g" < one-line-250-mb.txt

またはより少ないメモリ使用量の場合:

perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt

1
この段落全体は「Perl。」に要約されます。いくつかの詳細、または少なくとも例または何かが良いでしょう
マイケル・ムロゼック

@MichaelMrozek帽子のコレクションはロボエディットにつながる傾向があることを理解していますが、あなたの評判から少し注意を払うと思いました。具体的には、特定の問題は非常に狭い方法ですでに解決されているため、大多数の人が検索するのに役立ちません。そのため、一般的なケースの回答を追加しました。私が提供した拡張された答えは、実行可能な解決策がまだなかった場合、ニコラス・ラウルを助けたでしょうが、それが他の多くの人を助けるとは思えませんが、私の元の答えはsedの限界に達したすべての人を助けました。同意しない場合は削除します
2013

@hildred不快な動機の非難にすぐに頼ることなく、モデレーターが回答について有効なコメントをしているときにモデレーターに誠意を示すことができると思うのはそれほど多くはないと思います。
クリスダウン

@ChrisDown逆に言えば、私は完全に帽子を手にしています。また、これは複数の人からの回答ではないというフラグが立てられましたが、これは帽子の遠い2番目の優先事項です
マイケルム​​ロゼック

メモリ制限のある2番目の方法でうまくいきました(私の2.5GB 1行ファイルの場合):ありがとう!sedしかし、少しがっかり。:\
Tomislav Nakic-Alfirevic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.