非常に大きなファイルの文字列を置き換える


10

以下と同じ形式で、分離文字のない非常に長い一連のURLがあります。

http://example.comhttp://example.nethttp://example.orghttp://etc...

各URLを新しい行に配置します。sedを使用して「http://」のすべてのインスタンスを「\ nhttp://」に置き換えることでこれを試みました

sed 's_http://_\nhttp://_g' urls.txt

しかし、セグメンテーション違反が発生します(メモリ違反)。ファイルのサイズ(100 GBを超える)が原因で、sedが何らかの制限を超えていることが推測できます。

ファイルをいくつかの小さなファイルに分割して処理することもできますが、 "http://"のインスタンスはすべてそのままにしておく必要があります。

これを行うより良い方法はありますか?


sedは、バッファ内の1行を読み取ろうとするため、行末なしの100GBは好きではないと思います。
ジッピー

分割(「どこで」カットが発生するかに関係なく)、処理、その後の再組み立てでは、正しい結果が得られます。
enzotib 2012

3
本当に1行の長い行を含む100 GBのテキストファイルがある場合は、作業を行うための簡単なCプログラムを作成することをお勧めします。
fpmurphy 2012

回答:


11

ではawk、あなた一度に膨大な量のテキストを読んで回避できます。

awk -vRS='http://' -vORS='\nhttp://' 1 urls.txt > urlsperline.txt

成功は、使用awkされる実装に依存する場合があります。たとえば、gawk正常に動作しますが、mawkクラッシュします。


6

これは仕事をします:

perl -pe 'BEGIN { $/ = "//" } s!(?=http://\z)!\n!' urls.txt

$ /を設定する//ことで、改行ではなく行で終わるように行の定義を変更しました。これにより、Perlは一度に1つのURLを読み取ります。//スキームの後を除いてURLに含まれている可能性は低いですが、URLに含まれていても問題ありません。正規表現は、偽の改行を追加しないようにします。

最初のURLの前に空白行を追加したくない場合:

perl -pe 'BEGIN { $/ = "//"; print scalar <> } s!(?=http://\z)!\n!' urls.txt

ベンチマークを試して、s!http://\z!\nhttp://!が速いかどうかを確認してください。それらは同等です。/g「行」ごとに1つの一致しか存在できないため、フラグは置換に必要ではないことに注意してください。


perl regexpエンジンは数ギガバイトの長い行で問題ありませんか?
Alexios

2
@Alexios、おそらくそうではありませんが、そうである必要はありません。を変更したため$/、一度に1つのURLのみを処理します。
cjm

ああ、私はあなたがそこで何をしたかを見ます。90年代から久しぶりでしたがman perlvar、そのとおりです。
Alexios

Linuxでは、URLのパスに複数のスラッシュを埋め込むことができるため、これらのスラッシュがあると、このコードは失敗する可能性があります。文字列全体(httpなど)のテストでは、この問題は発生しません。
ジョー

@ジョー、私はhttp:正規表現でその部分をテストしています。すべてを検査//しますが、見つからない場合は改行を追加しませんhttp://
cjm 2012

5
  1. aのすべての出現:箇所を改行で変更して、ファイルを切り詰めます。
  2. 交換する
    • http 行末で
    • 改行の後にhttp:次の行を追加します
  3. 一度繰り返すと、偶数行と奇数行が更新されます

これらの手順は次のようになります。

tr ':' '\n' | sed -e '/http$/{N;s/http\n/\nhttp:/}' | sed -e '/http$/{N;s/http\n/\nhttp:/}'
  1. で始まらない行があるかどうかを確認しhttp://、行番号を出力します。これは、:がの後以外のURLのどこかにある場合にのみ発生しますhttp

    grep -nv '^http://'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.