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

cod*_*der 4 bash shell-script text-processing files patterns

我有一个包含表单 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 
Run Code Online (Sandbox Code Playgroud)

我被困在我必须从文件中读取 URL 并再次检查整个文件的部分。我是 bash 脚本的新手,因此我不知道该怎么做。

slm*_*slm 8

原始输入文件

假设以下输入格式:

http://www.google.com,

www.google.com,

google.com

yahoo.com
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

google.com : 3 
yahoo.com : 1 
Run Code Online (Sandbox Code Playgroud)

很难确定您所处的整个情况,但鉴于您向我们展示的输出,我倾向于首先转换输入文件,以便所有行都采用以下形式:

google.com
google.com
google.com
yahoo.com
Run Code Online (Sandbox Code Playgroud)

然后通过以下命令集运行此文件:

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

您可以清理输出的格式,使其符合您的要求,如下所示:

$ 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
Run Code Online (Sandbox Code Playgroud)

编辑#1

OP 有一个后续问题,他更改了示例中的输入。所以要计算这种类型的输入:

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

www.google.com,

google.com

yahoo.com/list/page/jhfjkshdjf...
Run Code Online (Sandbox Code Playgroud)

您可以使用第一个示例中的这种经过调整的单行:

$ 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
Run Code Online (Sandbox Code Playgroud)