Linux 命令实现单词计数功能



hadoop 的 mapreduce 有个入门的程序叫wordcount,相当于其它程序语言的helloworld,是用来统计输入文本中用指定分隔符切割后得到的每个单词的出现次数。

现在来说明在Linux中如何实现这一功能


1. 获取文件每一行的每个单词

这里用awk命令来实现

	awk -F(指定分隔符,默认空格或Tab) '{ for(i=1;i<=NF; i++){ print $i }}' filename

2. 将获得的每个单词进行排序

这里用到sort命令和管道


3. 然后进行去重操作

uniq -c 可以去重并显示出现的次数


例子: 我的文件是 hello.txt

	.......	$ cat hello.txt 
	HELLO WORLD WELCOME MY ZONE
	HELLO HADOOP MY JOB
	HELLO HADOOP 
	HADOOP WORLD 
	MY ZONE 
	HELLO A B C


用命令

	awk '{ for(i=1;i<=NF; i++){ print $i }}' hello.txt | sort | uniq -c



结果

      1 A
      1 B
      1 C
      3 HADOOP
      4 HELLO
      1 JOB
      3 MY
      1 WELCOME
      2 WORLD
      2 ZONE

这样就简单的实现了一个单词计数的功能。


如果想单词在前数字在后,可以再次使用awk命令

	awk '{ for(i=1;i<=NF; i++){ print $i }}' hello.txt | sort | uniq -c | awk '{print $2,$1}'

结果

	A 1
	B 1
	C 1
	HADOOP 3
	HELLO 4
	JOB 1
	MY 3
	WELCOME 1
	WORLD 2
	ZONE 2

当然如果想要输出美观,可以用awk的格式化输出 printf


现在我想统计一下单词出现最多的前三个该怎么办?当然就是按出现次数倒序sort,然后head -3

	awk  '{for(i=1;i<=NF;i++){print $i}}' hello.txt | sort | uniq -c | awk '{print $2,$1}' | sort -t ' ' -k2nr  | head -3


结果

	HELLO 4
	HADOOP 3
	MY 3


至于大文件运行效率如何,我觉得肯定是mapreduce更好。这个统计小文件应该还行。如果有不合理的地方,还请老鸟指正出来,谢谢。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AWK 命令是一种文本处理工具,它可以根据一定规则对文本进行处理。它的名称来自于其创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。AWK 命令在 Unix/Linux 系统中被广泛使用,尤其是在文本处理、数据分析和报告生成方面。 AWK 命令的基本语法格式为: ``` awk [options] 'pattern {action}' [input_file] ``` 其中,`options` 为可选参数,`pattern` 为匹配模式,`action` 为执行动作,`input_file` 为输入文件。AWK 命令会按照指定的模式匹配文件中的每一行,并对匹配的行执行相应的动作。 AWK 命令的常用选项包括: - `-F`:指定字段分隔符; - `-v`:定义一个变量; - `-f`:从一个文件中读取 AWK 脚本; - `-i`:原地修改文件。 AWK 命令的常用模式包括: - `/pattern/`:匹配包含指定模式的行; - `$n`:匹配第 n 个字段(从 1 开始计数); - `BEGIN`:在处理输入文件之前执行一次; - `END`:在处理输入文件之后执行一次。 AWK 命令的常用动作包括: - `print`:打印匹配的行或指定的字段; - `printf`:按指定格式输出内容; - `if-else`:条件语句; - `for`:循环语句。 例如,下面是一个简单的 AWK 命令示例,用于统计一个文件中每一行单词数: ``` awk '{print NF}' input.txt ``` 其中,`NF` 为 AWK 内置变量,表示当前行的字段数。 另外,AWF 命令不是一个常见的命令,可能是您笔误或者误解了。如果您有任何其他问题或者需要更详细的解释,请继续提问,我会尽力回答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值