关闭

C &&Linux 下简单实现单词统计

标签: 学习笔记Linux 命令行
724人阅读 评论(0) 收藏 举报
分类:

/*

功能实现:

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

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

 

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(均出现一次)

0
0
查看评论

c:统计单词数量2

上一篇c:统计单词数量中使用 issplace()来区分单词,过于粗糙。因为,.:等这样的标点符号都能区分单词。所以这一篇做了改进。使用isalpha()来区分单词。不过对于连写的单词,比如don't也会被识别成两个单词。这里也不作处理了。主要的开始分享一下思路,其实和上一篇差不多。但是相...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2017-11-12 21:07
  • 177

如何使用linux命令统计文本中某个单词的出现频率

使用这个命令查出文本中的单词出现频率按照由高到底排序 cat words.txt |tr -cs "[a-z][A-Z]" "[\012*]"|tr A-Z a-z|sort|uniq -c|sort -k1nr -k2|head -10 但是有时...
  • u012516914
  • u012516914
  • 2014-12-19 17:19
  • 3637

C语言实现对英文文章的单词统计

#include #include #include #include bool isA2z(char c) { bool bl = true; if(!((c >= 'A' && c = 'a' && c <= ...
  • u010655942
  • u010655942
  • 2013-12-21 17:23
  • 1134

C语言 统计单词个数

写一个程序统计一个单词(不区分大小写)在文章中出现的次数(单词指一个英文单词,全部由小写英文字母组成。单词的前后必须是符号字符或空字符)。 输入: 第一行是一些句子,表示一篇文章。(文章的长度不超过10000个字符)。 第二行是一个数字N(1≤N≤1062),代表查询的单词的数目。 以下...
  • tujiaw
  • tujiaw
  • 2011-12-10 00:53
  • 9462

C语言统计一个字符串中单词的个数

假定每个单词用空格隔开。 例子: 输入:how are you! 输出:3 两种方法: 一: #include #include #define SIZE 20 int main() { char str[SIZE]={'\0'}; int count...
  • abc5382334
  • abc5382334
  • 2014-05-24 01:59
  • 39268

c语言实现统计单词个个数

编程实现,从键盘上输入一行字符,统计其中单词的个数。 其中:单词以空格分隔,且空格的个数至少一个。 要求:数组类型为字符型       使用scanf输入一行字符。       输出:单词的个数。 &...
  • u012965373
  • u012965373
  • 2015-04-23 08:49
  • 2514

c语言统计从文件读取的文章中所有单词的出现次数

#include #include #include #define MAXLEN 100 typedef struct TreeNode { int count; char word[MAXLEN]; struct TreeNode *left; struct Tre...
  • hanshuilingyue
  • hanshuilingyue
  • 2014-02-14 17:32
  • 1487

linux 统计文件中单词出现次数

[请教]统计文件a.txt中“每个单词”的重复出现次数?若该文件大到几个G又该如何处理? 方案一: #!/bin/sh     #定义源文件和临时文件   srcfile=word.txt   te...
  • xunmengpiaoyun
  • xunmengpiaoyun
  • 2014-05-28 17:22
  • 2148

spark统计文献中每个英文单词出现的次数

实例英文文档 My father was a self-taught mandolin player. He was one of the best string instrument players in our town. He could not read music, but if he h...
  • hb707934728
  • hb707934728
  • 2016-12-15 10:19
  • 1596

用c实现单词长度的统计直方图

最近在看K&R的[《The C programming language(2nd Edition)》] [1],其中1.6节中有一道练习题Exercise 1-13,要求:Write a program to print a histogram of the length of word i...
  • zedvv
  • zedvv
  • 2015-12-17 15:01
  • 320
    个人资料
    • 访问:556441次
    • 积分:11679
    • 等级:
    • 排名:第1556名
    • 原创:535篇
    • 转载:24篇
    • 译文:75篇
    • 评论:90条
    自我简介
    nyist计科13级本科,bjtu17级在读硕士,喜爱算法,热爱编程,欢迎一起学习交流。
    博客专栏