Linux centos7 统计文本文件中所有单词

统计文本文件中高频词是常见操作(参考文章:Linux centos7 高频词统计)。而查找并统计文本文件中共有多少单词(独立字符串,包括中文或数字串)也是一项很好地实践项目。

本文主要应用命令替换、循环结构、sort、grep及awk命令等达到目标。最后剖析不同方法的差异且且提出使用建议。

bash中如何从文本文件中提取所有单词?主要有四维思路:用grep方法搜索所有单词存入一个变量;for循环遍历所有单词;while循环查找所有单词存入一个数组或打印输出;awk打印所有行之所有字段。

讨论项目主要目标:获取文件中的所有单词(是批独立数字串或英文字符串的简称)。仅存储每个单词一次,且不区分大小写。

本文训练素材:

cat test4.txt

123 222 345

my name is shantong

12345 789

my qq number is 36142959

my email is 36142959@qq.com

my ip is 192.168.1.141

my name is zhange

My telephone num is 13523072436

My qq number is 845537614

Server_name is Softeem

Company Site is http://www.pili-zz.net

MMMM1234

192.168.89.115

一、grep

grep命令可以搜索单词:加参数 –w;或在搜索字符前后加\b;或在搜索字符前加\< 后加\>;

而用对于未知的单词,可以使用posix字符[[:alpha:]],或\w

WORDS=`grep -o -E '\w+' filename | sort -u -f`

grep –o  仅显示匹配内容

grep –E  搜索表达式可用扩展正则

由grep搜索到的单词是所有文本文件的单词,有大量重复的,通过排序、去重,忽略大小写,可以用sort -u –f,达到单词唯一。

sort –u 排序时去掉重复

sort –f 排序时忽略大小写

命令替换格式``与$()效果相同,可以自由选择一种。

WORDS=$(grep -o -E "[[:alpha:]]+" filename|sort -u -f)   仅英语词组

WORDS=`grep -o -E "[[:alnum:]]+" test4.txt | sort -u -f`  包括数字或英文词组

 二、for循环

一个文本文件中,有大量单词,如果需要查找统计这些内容,首先想到的应该是用for循环,从文件中一个一个读取,或打印输出,或重定向到文件中。

for循环是按行循环读取的,不是按单词读取。我们可以把文本作为一个大的变量容器,我们一个一个单词读取,如下所示:

for word in $(<inputfile)

do

    echo "$word" >>outfile

done

echo `cat outfile |sort –u –f`

rm –fr outfile

写成一行代码:

for word in $(<test4.txt); do echo "$word" >>outfile; done;echo `cat outfile |sort -u -f`;rm-fr outfile

先用$(<inputfile)把文件作为一个变量,再进行循环。获取单词太多,需要重定向到一个文件,再排序、去重。中间临时文件可以执行完程序后删除(这是一个好习惯!)

如果不排序、去重,for循环查找到的单词是这样的:

三、while循环

默认情况下,while循环中的read命令是读取整行。因此,解决方案可能是读取整行,然后使用例如for再获得单词:

while read line; do

    for word in $line; do

        echo"word = '$word'"

    done

done <filename

与for循环一样,前面截图是未排序、去重的。

两个循环获取的单词也是一样多,功能相同。

四、awk

awk功能强大之处在于,利用此命令可以获取一行内容,也可以进一步列出行内的单词。可以格式化输出,有条件的输出部分或全部。

不排序去重查询输出文本文件的单词:

awk '{for(i=1; i<=NF; i++){print $i}}' text_file

排序且去重查询输出文本文件的单词:

awk   '{

             for(i=1;i<=NF;i++){

                count[$i]++

            }

        } END {

            for(k in count){

                print k

            }

        }'   test4.txt

写作一行代码:

awk '{for(i=1;i<=NF;i++){words[$i]++}}END{for(j in words){print j}}' test4.txt

加入内置变量RS的不同值,可以获取更详细的单词,不再包括单词与标点符号的组合。

小结

在利用bash命令行获取文本文件的所有单词方面,应用grep法最简单最快速,有重要参考价值。而获取比较理想的效果最好采取awk方法,其可以加入多种不同的分隔符,用于详细分解由不同标点符号或连接符构成的长串字符。

运用循环方法,思路明确,但由于分隔符不易设置,不能有效得到满意结果。即使利用排序、去重等手段,也不能分解如http://www.pili zz.net这样的长字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/49084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go 1.21中值得关注的几个变化

美国时间2023年8月8日&#xff0c;Go团队在Go官博上正式发布了1.21版本[2]&#xff01; 早在今年4月末&#xff0c;我就撰写了文章《Go 1.21新特性前瞻[3]》&#xff0c;对Go 1.21可能引入的新特性、新优化和新标准库包做了粗略梳理。 在6月初举办的GopherChina 2023大会上[4]&…

Docker(二) Docker容器

在docker中的容器都是由镜像所创建的&#xff0c;一个镜像可以创建多个容器。 一、调试Docker 启动Docker systemctl start docker 查看Docker中有哪些镜像 docker images 下载镜像 docker pull hello-world 运行镜像 docker run hello-world 出现 Hello from Docker! 这…

【官方中文文档】Mybatis-Spring #注入映射器

注入映射器 与其在数据访问对象&#xff08;DAO&#xff09;中手工编写使用 SqlSessionDaoSupport 或 SqlSessionTemplate 的代码&#xff0c;还不如让 Mybatis-Spring 为你创建一个线程安全的映射器&#xff0c;这样你就可以直接注入到其它的 bean 中了&#xff1a; <bea…

Python 从入门到实践第3版(中文版)正式版+编制版+电子版

Python编程&#xff1a;从入门到实践&#xff08;第3版&#xff09; ([美] 埃里克 • 马瑟斯&#xff08;Eric Matthes&#xff09;) 2023 (Z-Library)

WPF中手写地图控件(1)——基于瓦片地图的控件

基于瓦片地图的控件 本控件使用dotnet编写&#xff0c;基于WPF的数据绑定自动生成&#xff0c;可以用于展示瓦片地图。为了提高地图加载速度&#xff0c;我们使用了内存缓存和本地文件缓存技术&#xff0c;并采用从中心扩散异步等加载方式。这些技术的结合&#xff0c;使得地图…

【SA8295P 源码分析】系列文章链接汇总 - 持续更新中

【SA8295P 源码分析】00 - 系列文章链接汇总 - 持续更新中 一、分区、下载、GPIO等杂项相关二、开机启动流程代码分析二、OpenWFD 显示屏模块三、Touch Panel 触摸屏模块四、QUPv3 及 QNX Host透传配置五、Camera 摄像头模块&#xff08;当前正在更新中...&#xff09;六、网络…

java八股文面试[数据结构]——List和Set的区别

List和Set是用来存放集合的接口&#xff0c;并且二者都继承自接接口Collection List 中的元素存放是有序的&#xff0c;可以存放重复的元素&#xff0c;检索效率较高&#xff0c;插入删除效率较低。 Set 没有存放顺序不能存放重复元素检索效率较低&#xff0c;插入删除效率较…

学习笔记230818---对于promise失败状态处理的重要性

问题描述&#xff1a; 在项目中经常会出现如上的问题&#xff0c;这是因为&#xff0c;用promise封装的接口或第三方组件方法&#xff0c;如果只对成功的状态做处理&#xff0c;就会造成页面出错&#xff0c;报error。 解决方法 then()的末尾加上.catch(()>{})对失败的状态…

C++类和对象----封装(观看黑马教程整理的笔记)

1、简介 C面向对象的三大特性为&#xff1a;封装、继承、多态 C认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 例如&#xff1a; ​ 人可以作为对象&#xff0c;属性有姓名、年龄、身高、体重…&#xff0c;行为有走、跑、跳、吃饭、唱歌… ​ 车也可以作为对象…

MySQL索引可能失效之or、is null、is not null、不等于(!=,<>)、联合索引

1、如果 A,B 两列都有索引&#xff0c;那么 select * from Table where Aa or Bb; 会走索引吗&#xff1f; 答案&#xff1a;会&#xff0c;因为 A,B都有索引&#xff1b; 2、如果 A,B有索引&#xff0c;但是C没有索引&#xff1b; select * from Table where Aa or Bb …

线程与进程,你真得理解了吗

线程与进程&#xff0c;你真得理解了吗 1 进程与线程的关系和区别2 并行与并发3 线程共享了进程哪些资源 相信大家面试时一定没少被一个问题刁难&#xff0c;那就是进程和线程的区别是什么&#xff1f;这个问题延申开来并不像表面那么简单&#xff0c;今天就来深入一探。 开始…

无涯教程-PHP - 标量函数声明

在PHP 7中&#xff0c;引入了一个新函数&#xff0c;即标量类型声明。标量类型声明有两个选项- Coercive - 强制性是默认模式。Strict - 严格模式必须明确提示。 可以使用上述模式强制执行以下类型的函数参数- intfloatbooleanstringinterfacesarraycallable 强制模…

【Unity】如何制作小地图

我们为什么要制作小地图呢&#xff1f; 原因很简单&#xff1a; 导航和定位&#xff1a;小地图可以显示玩家当前位置以及周围环境的概览。这使得玩家能够更好地导航和定位自己在游戏中的位置&#xff0c;找到目标或避开障碍物。场景了解&#xff1a;通过小地图&#xff0c;玩…

Windows10上VS2022单步调试FFmpeg 4.2源码

之前在 https://blog.csdn.net/fengbingchun/article/details/103735560 介绍过通过VS2017单步调试FFmpeg源码的方法&#xff0c;这里在Windows10上通过VS2022单步调试FFmpeg 4.2的方法&#xff1a;基于GitHub上ShiftMediaProject/FFmpeg项目&#xff0c;下面对编译过程进行说明…

渗透测试面试题汇总(附答题解析+配套资料)

注&#xff1a;所有的资料都整理成了PDF&#xff0c;面试题和答案将会持续更新&#xff0c;因为无论如何也不可能覆盖所有的面试题。 一、思路流程 1、信息收集 a、服务器的相关信息&#xff08;真实ip&#xff0c;系统类型&#xff0c;版本&#xff0c;开放端口&#xff0c;…

vue 实现腾讯地图搜索选点功能(附加搜索联想功能)

注意&#xff1a;开发环境、正式环境需在腾讯地图配置ip地址白名单、域名白名单 封装map组件&#xff1a; <template><iframe width"100%" style"border: none;width: 100%;height: 100%;" :src"map_src"></iframe> </t…

新服务器基本环境下载conda + docker + docker-compose + git

文章目录 Ubuntu 允许root用户登录 centos无所谓condadockerubuntucentos docker-compose官方下载docker-compose国内镜像 gitUbuntuCentos Ubuntu 允许root用户登录 centos无所谓 # 以普通用户登录系统&#xff0c;创建root用户的密码 sudo passwd root# SSH 放行 sudo sed -…

Java免费自学网站墙裂推荐!!!!

最近&#xff0c;常有一些读者问我&#xff1a;“有没有什么推荐的Java学习网站啊&#xff1f;” 因为一直没有时间&#xff0c;所以我之前也是让大家上知乎、搜索引擎搜一下就好了。 但是&#xff0c;我深知不能这样&#xff0c;应该拿出更真诚的态度带来优质的内容。 于是…

uni-app开启gzip配置

指令&#xff1a;npm install webpack4.46.0 --save-dev 指令&#xff1a;npm install compression-webpack-plugin6.1.1 --save-dev vue.config.js const CompressionWebpackPlugin require(compression-webpack-plugin);module.exports {configureWebpack: config > {…

IntelliJ IDEA 编辑器的全局搜索中使用正则表达式

打开 IntelliJ IDEA 编辑器。 使用快捷键 Ctrl Shift F&#xff08;Windows / Linux&#xff09;或 Cmd Shift F&#xff08;Mac&#xff09;打开全局搜索窗口。在搜索框中输入要搜索的内容&#xff0c;例如&#xff1a;“设备【】已经绑定网关”。在搜索框旁边的 “.*” …