次の形式のURLのリストを含むファイルがあります。
編集する
http://www.google.com/absd/siidfs/kfd837382$%^$&,
www.google.com、
Googleサイト
yahoo.com/list/page/jhfjkshdjf…
次の出力を表示するスクリプトを作成したいと思います。
google.com : 2
http://www.google.com: 1
yahoo.com : 1
ファイルからURLを読み取ってファイル全体を再確認する必要がある部分が詰まっています。私はbashスクリプトに初めて触れて何をすべきかわかりません。
答え1
ソース入力ファイル
入力形式が次のと仮定します。
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...
最初の例では、変更された1行のコードを使用できます。
$ 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
答え2
正しい数を得るためにおよびを使用してから、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}'