Как найти частоту появления строк, содержащихся в файле?

У меня есть файл, содержащий список 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 

EDIT # 1

У ОП был следующий вопрос, в котором он изменил исходные данные в примере. Поэтому, чтобы подсчитать этот тип ввода:

 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}'