フォームの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スクリプトを初めて使用するため、これを行う方法がわかりません。
次の入力形式を想定しています。
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
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
カウントを正しくするにはsort
とuniq -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}'