Linux脚本练习之script075-域名进行计数排序处理

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux脚本练习之script075-域名进行计数排序处理相关的知识,希望对你有一定的参考价值。

script075

题目

注:题目来源于 SHELL18 域名进行计数排序处理

假设我们有一些域名,存储在 nowcoder.txt 里,现在需要你写一个脚本,将域名取出并根据域名进行计数排序处理。

假设nowcoder.txt内容如下:

http://www.nowcoder.com/index.html
http://www.nowcoder.com/1.html
http://m.nowcoder.com/index.html

你的脚本应该输出:

2 www.nowcoder.com
1 m.nowcoder.com

脚本一

实际上就是提取网站地址的域名,首先使用 awk 命令取出第三列字段(通过 / 进行分隔),然后使用 sort 命令进行排序,再通过 uniq -c 命令去重并统计重复次数,再通过 sort -nr 按照重复次数倒序排序,最后通过 sed 命令去重每行开头的空格。

awk -F "/" 'print $3' nowcoder.txt | sort | uniq -c | sort -nr | sed 's/^[ \\t]*//g'

脚本二

使用 awk 命令编程,同样通过 / 字符进行分隔行,然后将第三个字段域存储到关联数组中,并记录它们的出现次数;最后在 END 中循环遍历关联数组中,输出键名和对应的键值。注意进行排序处理。

awk -F "/" '
  for(i=1;i<=NF;i++)
    if(i==3)
      arr[$i]++
    
  
 END
  for(k in arr)
    printf("%d %s\\n", arr[k], k)
  
' nowcoder.txt | sort -r -k 1

脚本三

跟脚本二的原理一样,都是把字段存储到关联数组中,并对出现次数进行计数。只不过是通过 shell 脚本编程实现,而非 awk 编程实现。

#!/bin/bash

# 声明关联数组
declare -A arr 

# 循环读取文本行
while read line; do
  # 删除 // 前面的所有内容
  line=$line#*//
  # 删除 / 后面的所有内容
  line=$line%%/*
  # 存储到关联数组中并计数
  arr[$line]=$[ $arr[$line] + 1 ]
done < nowcoder.txt

# 为了能对结果排序,所以要进行处理
result=""
# 循环打印关联数组,对它们进行拼接
for k in $!arr[@]; do 
  # 如果是第一次则进行赋值
  if [ "$result" == "" ]; then
    result="$arr[$k] $k"
  # 如果不是第一次则需要对之前的内容进行拼接,通过换行符拼接  
  else
    result="$arr[$k] $k""\\n$result" 
  fi
done

# 然后使用 sort 命令进行排序
echo -e "$result" |  sort -r -k 1

以上是关于Linux脚本练习之script075-域名进行计数排序处理的主要内容,如果未能解决你的问题,请参考以下文章

Linux脚本练习之script076-打印等腰三角形

Linux脚本练习之script076-打印等腰三角形

Linux脚本练习之script086-etstat练习之查看各个状态的连接数

Linux脚本练习之script086-etstat练习之查看各个状态的连接数

Linux脚本练习之script087-netstat练习之查看和3306端口建立的连接

Linux脚本练习之script087-netstat练习之查看和3306端口建立的连接