如何查找文件中包含的字符串出现的频率?

如何查找文件中包含的字符串出现的频率?

我有一个文件,其中包含以下形式的 URL 列表

编辑

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

www.google.com,

谷歌网站

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...

您可以使用第一个示例中经过修改的单行代码:

$ 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

您可能想使用sortuniq -c来获得正确的计数,然后使用sedawk进行最终格式化。像这样的东西:

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

如果这不完全正确,您可以修改sedawk命令以使主机名形式和输出格式正确。例如,要清除较长 URL 的右侧:

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

相关内容