掘金 后端 ( ) • 2024-03-29 14:49

theme: hydrogen

统计一个文本中某个关键字出现的次数,可以采用多种方法,这里分别给出在Excel和C语言中的解决方案:

在C语言中统计:

以下是一个简化的C语言程序片段,用来统计用户输入文本流中某个关键字出现的次数:

#include <stdio.h>
#include <string.h>

#define MAX_WORD_LENGTH 30
#define NKEYS  /* 定义关键字表大小 */
#define KEYWORD "关键字" // 替换为你要查找的实际关键字

struct KeywordCount {
    char word[MAX_WORD_LENGTH];
    int count;
} keytab[NKEYS];

// 假设getword函数从输入流中获取下一个单词并存入word数组
// 返回值为0表示输入结束
int getword(char word[]);

int main() {
    char word[MAX_WORD_LENGTH];
    int n;

    while (getword(word) != 0 && strcmp(word, "quit") != 0) {
        if ((n = binarysearch(word, keytab, NKEYS)) >= 0) {
            keytab[n].count++;
        }
        // 如果关键字表中没有该词,则需添加到表中并初始化计数
        else if (/* 判断是否为待统计的关键字 */) {
            strcpy(keytab[n].word, KEYWORD);
            keytab[n].count = 1;
        }
    }

    // 这里假设binarysearch函数已实现查找关键字的功能
    // 并返回关键字在关键字表中的索引,若未找到则返回负数

    // 统计完成后,打印关键字出现次数
    for (int i = 0; i < NKEYS; ++i) {
        if (strcmp(keytab[i].word, KEYWORD) == 0) {
            printf("Keyword \"%s\" appears %d times.\n", KEYWORD, keytab[i].count);
            break;
        }
    }

    return 0;
}


这个C语言示例假设有一个预定义的关键字表结构体数组,并通过调用getword函数逐个读取输入的单词。当遇到待统计的关键字时,增加其在关键字表中的计数。请注意,这个例子需要自行填充实际的binarysearch函数实现及关键字处理逻辑。如果只需要统计一个固定的关键字,不需要搜索关键字表,则可以直接在循环内比较并累加计数。

在Excel中统计:

精确匹配:如果你想统计关键字在指定区域内精确出现的次数,可以使用 COUNTIF 函数。例如,如果你要在范围 A1:A5 中统计 "北京" 出现的次数,公式如下:

 =COUNTIF(A1:A5, "北京")

模糊匹配:

若要包括关键字作为子串的情况,可以在 COUNTIF 函数的条件中加入通配符星号 *。比如统计包含 "北京" 字样的单元格数量:

     =COUNTIF(A1:A5, "*北京*")

计算单个字符出现次数:

要统计特定字符(如“京”)出现的总次数,可以使用 SUBSTITUTE 和 LEN 函数配合 SUMPRODUCT 函数

     =SUMPRODUCT((LEN(A1:A5) - LEN(SUBSTITUTE(A1:A5, "京", ""))))

在linux中

在Linux中,统计一个文本文件中某一个关键字出现的次数,可以使用多种命令工具来完成,以下是一些常见的方式: 使用grep与wc结合

grep -o -w "关键字" filename.txt | wc -l
  • -o 参数让grep只输出匹配到的模式(这里是“关键字”),而不是整行。
  • -w 参数确保匹配整个单词,避免部分匹配。
  • wc -l 统计输出行数,即关键字出现的次数。

使用grep的-c选项

grep -c "关键字" filename.txt
  • -c 参数会让grep直接输出文件中匹配行的数量。注意,如果一行中有多次匹配,-c会将此行算作一次。

使用awk

awk '/关键字/ {count++} END {print count}' filename.txt
  • awk脚本会在每一行匹配到“关键字”的时候增加count变量的值,最后在END块中输出总计数。

使用sed

sed -n '/关键字/=' filename.txt | wc -l
  • -n 参数使sed不打印行,而/关键字/=会匹配到关键字的行并打印行号。
  • 结合wc -l得到关键字所在行的数量,即出现次数。

使用Perl单行脚本

perl -ne 'print scalar(grep /关键字/, split /\s+/, $_);' filename.txt | wc -l
  • Perl脚本会逐行读取文件,然后按空格拆分行内容为单词列表,并使用grep函数找出含有关键字的元素,最后统计这些元素的数量。
  • 选择哪种方法取决于具体需求,比如是否区分大小写、是否要求完全匹配单词等。以上命令均假设关键字是不包含特殊正则表达式字符的普通文本。如果有正则表达式字符,请确保正确转义它们。
grep -oc '关键字' example.txt

这条命令会直接输出"关键字"在example.txt文件中出现的确切次数。不过需要注意的是,如果一行中有多个"关键字"连续或间隔出现,-o选项会使每个匹配项都被单独计算,因此在这种情况下,结果将是所有独立出现的"关键字"总数。如果希望一行中仅计算一次,那么可能需要考虑其他方案或者对关键词前后添加适当的上下文限定。

如果希望一行中仅计算一次应该怎么写呢?

如果您希望在一行中仅计算一次关键字出现的次数,即使该行中有多个重复的关键词,可以略去 -o 选项,仅使用 -c 选项来统计包含关键字的行数。以下是相应的 grep 命令:

grep -c '关键字' example.txt

这条命令会统计在 example.txt 文件中包含关键词“关键字”的行数,无论一行中有多少次出现该关键字,都会被当作一次计算。