C Linux 下简单实现单词统计

2024-08-27 02:32

本文主要是介绍C Linux 下简单实现单词统计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*

功能实现:

从文本文档里读取英文单词,可能含有中文字符,

实现英文单词,中文字符的数目统计

 

Author :贺荣伟

creat Time: 16:01 2015/7/10 星期五

 

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>const int str_len=1010;
char str[str_len];
bool vis[str_len];typedef long long LL;
typedef unsigned long long LLU;int word_count,hanzi_count;void is_word();
void is_hanzi();/*//fgets 方法:char *fgets(char *string, int n, FILE *stream)从文件stream中读取n-1个字符/一行(若一行不满n-1个),string接收字符串如果n <= 0,返回NULL如果n == 1,返回" ",也就是一个空串如果成功,返回值等于string, 也就是获得字符串的首地址//如果出错,或者读到FILE的结尾,返回NULL.FILE *textfile=fopen("text.txt","r");///打开一个文件while(fgets(str,str_len,textfile)!=NULL){str[strlen(str)-1]='\0';printf("%s \n",str);printf("the text size is %d\n",strlen(str));}fclose(textfile);
*/void is_word()
{char ch;bool flag=0;int word_count=0,length=0;FILE *fp=fopen("text.txt","r");       / *打开文件 */while((fp==NULL))                /*打开失败 */{puts("text.txt open failure");exit(0);}while(fgets(str,str_len,fp)!=NULL) /*fgets 的定向输入,获取输入流的长度 */{length=strlen(str);}fclose(fp);for(int i=0; i<length; ++i)       /*判断单词 */{if(isalpha(str[i])&&flag==0){word_count++;flag=1;}if(!isalpha(str[i])){flag=0;}}/*while(!feof(fp)){ch=fgetc(fp);///if(isalpha(ch))if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'){flag==0;}else if((flag==0)&&(ch!='-'&&ch!='/'&&ch!='\'')){word_count++;flag=1;}}fclose(fp);*/printf("单词个数为: %d 个\n",word_count);
}void is_hanzi()
{int ch,hanzi_count=0;FILE *fp=fopen("text.txt","r"); /*打开文件 */while((fp==NULL)){puts("text.txt open failure"); /*打开失败 */exit(0);}while(!feof(fp)){ch=fgetc(fp);///ASCII 最大127  /*判断汉字 */if(ch>127) {fgetc(fp);hanzi_count++;}}fclose(fp);printf("中文字符为: %d 个\n",hanzi_count);
}
int main()
{is_word();  /*调用 is_word() 函数*/is_hanzi(); /*调用 is_hanzi() 函数*/return 0;
}

测试:

 

 

Linux系统命令行统计文本单词个数及出现频率:

参数:wc  -w,  text.txt
打印单词数(print the word counts)

测试:

文本内容:

We are two boy

结果 4

统计单词出现频率:

这个刚学shell,有些不懂,查找书籍资料和网上资源,知道是这样这样写:

命令行:

Cat text.txt |tr -cs "[a-z][A-Z]" "[\012*]"|tr A-Z a-z|sort|uniq -c|sort -k1nr -k2|head -10

简单分析:cat text.txt:表示创建一个文件。

          |:表示重定向,即把上一个命令的结果传递给下一个命令。

          tr 命令:tr是transform的缩写,该命令是著名的流处理命令sed的简化版,也是用来对文档进行转换的。

          tr -cs “[a-z][A-Z]" "\n"  -c表示取“[a-z][A-Z]"的补集(complement),-s 表示把连续的匹配压缩成一个”\012“,*号表示将集合2中的字符补全,与集合1的字符长度一致,所以整个命令就是把除了字母外的其他字符一律压缩成换行符,如果有连续的匹配,则只转换成一个换行符。

tr A-Z a-z 把大写统一转换成小写。

sort 排序 按字母顺序

uniq 去重 该命令必须对排序好的文档进行,-c 表示打印出字母的重复次数

然后再次 sort ,这次sort比较复杂,因为在uniq命令后 输出结果已经变成了 如下形式:

n word (单词的重复次数+空格+单词)

所以 -k1nr表示对第一列(-k1)的数字形式(-n)的变量进行逆序(-r 从大到小)排列 , -k2表示在前面的排序基础上对重复次数一致的单词进行按字母顺序的排列。

最后是head -n$1,表示只显示结果的前$1行。

文本内容:

We are to boy

结果:

1 are

1 boy

1 to

1 we(均出现一次)

这篇关于C Linux 下简单实现单词统计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110381

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor