web-dev-qa-db-ja.com

ファイルに含まれる文字列の出現頻度を見つける方法は?

フォームのURLのリストを含むファイルがあります

[〜#〜]編集[〜#〜]

http://www.google.com/absd/siidfs/kfd837382 $%^ $&、

www.google.com、

google COM

yahoo.com/list/page/jhfjkshdjf.。

次の出力を表示するスクリプトを書きたい

 google.com : 2
http://www.google.com: 1
yahoo.com : 1 

ファイルからURLを読み取って、ファイル全体をもう一度確認する必要がある部分で立ち往生しています。私はbashスクリプトを初めて使用するため、これを行う方法がわかりません。

4
coder

元の入力ファイル

次の入力形式を想定しています。

http://www.google.com,

www.google.com,

google.com

yahoo.com

結果は次のようになります。

google.com : 3 
yahoo.com : 1 

現在の状況全体を特定することは困難ですが、表示されている出力から、すべての行が次の形式になるように、まず入力ファイルを変換する傾向があります。

google.com
google.com
google.com
yahoo.com

次に、次の一連のコマンドを使用してこのファイルを実行します。

$ grep -v "^$" data.txt | \
      sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \
      sort | uniq -c
      3 google.com
      1 yahoo.com

次のように、出力の形式をクリーンアップして、必要なものと一致させることができます。

$ grep -v "^$" data.txt | \
      sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \
      sort | uniq -c | \
      awk '{printf "%s : %s\n", $1, $2}'
      google.com : 3
      yahoo.com : 1

編集#1

OPにはフォローアップの質問があり、例の入力を変更しました。したがって、このタイプの入力をカウントするには:

http://www.google.com/absd/siidfs/kfd837382$%^$&,

www.google.com,

google.com

yahoo.com/list/page/jhfjkshdjf...

最初の例から、この適応されたワンライナーを使用できます。

$ grep -v "^$" data2.txt | \
      sed -e 's/,$//' \
          -e 's#\(http://[^/]\+\).*#\1#' \
          -e '/^[^http]/ s/^www\.//' \
          -e '/^[^http]/ s#\([^/]\+\).*$#\1#' | \
          sort | uniq -c | \
          awk '{printf "%s : %s\n", $1, $2}'
2 : google.com
1 : http://www.google.com
1 : yahoo.com
8
slm

カウントを正しくするにはsortuniq -cを使用し、次にsedまたはawkを使用して最終的なフォーマットを行います。このようなもの:

sort file | uniq -c | awk '{printf "%s : %s\n", $1, $2}'

元の質問はおそらく同じ基本的なパイプラインで答えることができますが、最初に入力を編集します。

sed -e 's/http:\/\///' -e 's/^www\.//' file | sort | uniq -c |
awk '{printf "%s : %s\n", $1, $2}'

それが正確に正しくない場合は、sedコマンドとawkコマンドをいじって、ホスト名の形式と出力形式を正しく取得できます。たとえば、長いURLの右側を削除するには:

sed -e 's/http:\/\///' -e 's/^www\.//' -e 's/\/..*$//' file |
sort | uniq -c |
awk '{printf "%s : %s\n", $1, $2}'
4
Bruce Ediger