当前位置: 首页 > article >正文

Linux: Shell编程中的应用之基于sh进行数据统计

应用场景

  • 对一个英语字典做统计
  • 统计字符出现最多,并进行排序输出

实现思路

  • 这里需要
    • 统计每个字母出现的次数 grep 命令
    • 小写转大写
  • 可以先在命令行实验
    • $ grep -i a words.txt
      • -i 忽略大小写
      • 这里每一行可能包含不止一个匹配的字母
    • $ grep -io a words.txt
      • -o 只显示匹配行中不为空的匹配部分,这样的部分被单独显示在一行上
      • 为了统计某个字母的所有统计,需要加 -o
    • $ grep -io a words.txt | wc -l 统计行数
      • 这里会有一个行数的数字输出
      • 可以对比 不加 o 参数的区别,输出一定是少的
    • 继续在终端中输入实验
      • $ for char in {a..z}; do
      • > grep -io "$char" words.txt | wc -l
      • > done
    • 之后按下回车,变会输出几行数字
  • 以上是我们的思路

环境准备


1 )字典集 words.txt

部分信息展示如下:

aa
aaa
aah
aahed
aahing
aahs
aal
aalii
aaliis
aals
aam
aardvark
aardvarks
... 后续过多,不便在此展示

此文件资源在文章顶部可进行下载

2 ) 脚本准备

$ vim statistics.sh

#!/bin/bash

# Verification of parameter
# 确认参数, 不存在参数,则提示并退出
if [ -z $1 ]
then
    echo "Please enter the file of dictionary !"
    exit
fi

# Verification of file existence
# 确认文件存在
if [ ! -e $1 ]
then
    echo "Please make sure that the file of dictionary exists !"
    exit
fi

# Definition of function
# 函数定义
statistics () {
  # 遍历 a ~ z 中间的 26 个字母
  for char in {a..z}
  do
  	# tr 命令是 translate 的缩写,用于转化或删除字符
  	# tr /a-z/ /A-Z/ 表示将所有的小写字母转化为对应的大写字母
    echo "$char - `grep -io "$char" $1 | wc -l`" | tr /a-z/ /A-Z/ >> tmp.txt
  done
  # 使用 sort 命令对 tmp.txt 文件中的行进行排序
  # -r 倒序排列,-n 对数字排序,-k 指定根据哪几列进行排序,-t 指定列之间的分隔符
  sort -rn -k 2 -t - tmp.txt
  rm tmp.txt
}

# Use of function
# 函数使用
statistics $1

授权执行:$ chmod +x statistics.sh
执行:$ ./statistics.sh words.txt

最终输出结果

E - 363325
I - 297800
A - 273400
S - 245420
N - 242172
O - 241766
R - 237931
T - 223998
L - 187617
C - 146090
U - 126597
P - 109040
D - 108173
M - 99955
H - 86490
G - 80206
Y - 67946
B - 61975
F - 38763
V - 32467
K - 25618
W - 22053
Z -13932
X - 10112
Q - 5696
J - 5073
  • 可能的优化
    • 除了一个参数,也就是要统计的字典文件的名字
    • 还可以添加其他参数来完成更多任务
    • 可以改变输出的形式,使之更美观
    • 每一行可能输出更多信息
    • 尝试不借助中间文件 tmp.txt

http://www.kler.cn/news/367551.html

相关文章:

  • 音视频同步版本【基于音频】
  • C++11实践指北
  • mac安装使用kubectl客户端
  • HarmonyOS 相对布局(RelativeContainer)
  • DEVOPS: 容器与虚拟化与云原生
  • 西瓜书《机器学习》符号表KaTex表示
  • 【C++ 真题】B2106 矩阵转置
  • 基于java SpringBoot和Vue校园求职招聘系统设计
  • 【牛客算法】某司面试算法题:设计LRU缓存结构
  • static 关键字的用法
  • 【Java】LinkedList实现类的使用
  • 苹果预告下周发布Mac新品:全系标配M4系列芯片
  • 前端处理API接口故障:多接口自动切换的实现方案
  • bluez hid host介绍,连接键盘/鼠标/手柄不是梦,安排
  • 日常实习与暑期实习详解
  • java使用正则表达式校验字符串pwd,是否符合包含大写小写数字特殊字符长度超过8位
  • Codeforces Round 981 (Div. 3) A - E 详细题解(C++)
  • maven分模块设计与私服
  • 如何用mmclassification训练多标签多分类数据
  • 如何理解前端与后端开发
  • entwine 和 conda环境下 使用和踩坑 详细步骤! 已解决
  • uptime kuma拨测系统
  • 身份证归属地查询接口-在线身份证归属地查询-身份证归属地查询API
  • 论文略读:Less is More: on the Over-Globalizing Problem in Graph Transformers
  • 2FA-双因素认证
  • 基于Python的智能求职分析系统