0

ファイルからドメイン名と完全なドメイン拡張子を抽出するために、次のコマンドを使用しています。例:www.abc.yahoo.com、www.efg.yahoo.com.us。

[a-z0-9\-]+\.com(\.[a-z]{2})?' source.txt | sort | uniq | sed -e 's/www.//' 
> dest.txt

-m 100の後に小さな最大パラメータを指定すると、コマンドは正しく書き込みますsource.txt。指定しなかった場合、または膨大な数を指定した場合の問題。ただし、以前はgrep(egrepではなく)を使用して、現在試しているものと同様の膨大な数のファイルに書き込むことができ、それは成功しました。コマンド実行中に最終変更日時も確認しましたが、宛先ファイルに変更がないようです。何が問題なのか?

4

2 に答える 2

1

以前の質問で述べたように、おそらく の問題ではありませんegrepが、ファイルが大きすぎて、egrep が完了するまでsort何も出力されません。splitコマンドuniqを使用して、ファイルを管理しやすいチャックに分割することをお勧めします。このようなもの:

split -l 10000000 source.txt split_source.

これにより、ファイルが 、 などと呼ばれる 1000 万行のチャンクに分割されますsource.txt。また、これらのファイルのそれぞれに対してコマンド全体を実行できます (パイプを最後に追加するように変更することもできます: )。split_source.asplit_source.bsplit_source.c>> dest.txt

ここでの問題は、複数のファイルで重複を取得できることです。そのため、最後に実行する必要がある場合があります

sort dest.txt | uniq > dest_uniq.txt
于 2012-07-30T04:42:52.070 に答える
0

あなたの質問には情報がありません。

それはさておき、いくつかの考え。まず、問題をデバッグして切り分けます。

  1. を実行して、egrep <params> | less何が行われているかを確認し、 、、または(私の賭けは)egrepsから問題を取り除きます。sortuniqsedsort

  2. あなたのインプットはどれくらいですか?sort入力が多すぎて死ぬ可能性はありますか?

  3. さらにコメントするには、完全なコマンドを確認する必要があります。

次に、スクリプトを改善するには:

  1. sort | uniqAFTERが必要sedな場合があります。そうしないと、結果セットに重複が発生し、並べ替えられていない結果セットになる可能性があります。多分それはあなたが望むものです。

  2. 行頭 (^) と行末 ($) アンカーを確立することが適切な場合は、正規表現を「^...$」でラップすることを検討してください。そうしないと、行の途中で一致する部分になります。

于 2012-07-30T02:26:05.697 に答える