命令太多,记不住,组合起来用一把…..
示例文件:

1
2
3
4
5
6
7
8
9
10
11
[root@lovedan test]# cat a.txt
hello
good
world
hello
hello
good
dandan
good
hello
world

场景/分析: 统计a.txt出现次数前3名的单词

  • 出现次数用awk统计
  • 排名用sort命令排序
  • 取文件前N行用head命令

    awk命令

    awk是以文件的一行为处理单位的,awk每接收文件的一行,然后执行相应的命令处理文本
    awk玩法请参考文档

    1
    2
    3
    4
    5
    [root@lovedan test]# awk '{sum[$1]+=1} END {for(k in sum) print k ":" sum[k]}' a.txt
    hello:4
    dandan:1
    good:3
    world:2

注: 如上结果,每读取一行,得取到那个单词,这是$1,有其它的分隔符则-F等,取具体的$n,
以上用sum数组存储,key是自每行的单词,每读取一行加1,END是最终执行,循环打印内容
单词由次数显示出来,则只要按冒号后的数字倒序排序即可
ok,单词及次数已整理出来,只要排序就妥了,sort命令走起


sort命令

  • 格式 sort 【参数】【文件】
  • 参数 -n 以数字排序
  • 参数 -r 倒序
  • 参数 -t 第几区间【分隔后分隔后的第几列】
  • 参数 -k 以第几区间【分隔后分隔后的第几列】来排序
  • eg: sort -n -r -k 2 -t ‘:’ xx.txt -n数字排序方式, -r倒序, -t ‘:’以冒号分隔, -k 2表示以冒号分隔后的第2例
  • 结果示例
    1
    2
    3
    4
    5
    [root@lovedan test]# awk '{sum[$1]+=1} END {for(k in sum) print k ":" sum[k]}' a.txt | sort -n -r -k 2 -t ':'
    hello:4
    good:3
    world:2
    dandan:1

ok,排序了后,只用取前多少行就妥了,head命令走起

head命令

  • 格式 head 【参数】【文件】
  • 参数 -n<行数> 显示的行数
  • 显示前10行 head -10 xx.txt
  • 结果示例
    1
    2
    3
    4
    [root@lovedan test]# head -n 3 a.txt
    hello
    good
    world

最终结果

1
2
3
4
[root@lovedan test]# awk '{sum[$1]+=1} END {for(k in sum) print k ":" sum[k]}' a.txt | sort -n -r -k 2 -t ':' | head -n 3
hello:4
good:3
world:2

貌似上面都复杂了但awk是个神器,uniq命令也可以而有时会显得局限(毕竟日志中没有这么简单的数据)

1
2
3
4
[root@lovedan test]# sort a.txt | uniq -c | sort -nr -t ' ' -k 1 | head -n 3
4 hello
3 good
2 world

文不对题请见谅,以上都是小打小闹,请君看下面

若有道面试说有个文件中有1000W行,每行一个单词,现要统单词词频排名前10的查询出来
你有哪些方案方法?

  1. shell统计如上
  2. 读取文件再统计排名前10(如下python)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # encoding=utf-8
    from collections import defaultdict
     
    words = defaultdict(int)
    with open('/usr/local/test/a.txt') as f:
    for line in f:
    words[line.strip()] += 1
     
    list = sorted(words.items(), key=lambda words: words[1],reverse=True)
    print(list[0:10])
  3. 若文件大到几个G,数据条数过亿,而且最快最高效率完成目标
    面试官问你怎么办?答:MapReduce 见【传送门*大世界^_^

重要的是思维与格局,分而治之,智慧合作

awk 统计的更多相关文章

  1. awk统计命令(求和、求平均、求最大值、求最小值)

    本节内容:awk统计命令 1.求和 cat data|awk '{sum+=$1} END {print "Sum = ", sum}' 2.求平均 cat data|awk '{ ...

  2. awk 统计出现次数--转

    知识点: 1)数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常称为键,数组元素的键和值存储在Awk程序 ...

  3. 使用awk统计字段重复实践

    awk awk是一种规格化文件的分析工具, 主要处理对象类似数据库导出的条目文本文件, 其中一行,就对应一个记录,每个记录包含若干个字段. 类似这种文本: [root@www ~]# last -n ...

  4. awk 统计数据在文件中的出现次数

    突然发现awk原来可以统计同一数据在要处理的文件中所出现的次数.原来的时候为了分析数据还自己写程序,哎,无语,当时还以为自己多强,手工分析不过来的东西写程序处理.现在想来实在是年少轻狂.解决问题嘛,不 ...

  5. shell awk统计重复个数

    awk是一个很强大的工具,一个常见的用法就是统计一个文件中重复的列值的个数,这也是面试时面试官经常问的一个问题. 举个例子: 有个文件file.log的内容如下: http://www.sohu.co ...

  6. awk统计文本里某一列重复出现的次数

    比如这样的场景:现在有一个文本,里面是这样的内容: NOTICE: 12-14 15:11:13:  parser. * 6685  url=[http://club.pchome.net/threa ...

  7. 利用 awk 统计nginx 中某一个用户的访问次数

    线上总是会遇到攻击,所以就需要分析 access.log 看看那些用户的访问次数不正常,针对这些不正常的用户,要做处理,以 access.log为例说明下怎么统计. 通过 access.log 日志来 ...

  8. awk统计文件大小

    在Linux系统中,经常会遇到某个目录下文件很多,要统计这些文件的空间大小.可以采用awk来实现.如下是实现这个功能的例子. vim sum.sh #!/bin/bash# sum.shcd //ba ...

  9. awk 统计文件中按照某列统计某列的和(sum)

    把第一列相同的名称的第二列加起来: [root@localhost cc]# cat 1.txtaaa 10 bbb 20aaa 30ccc 40ccc 20ccc 40 [root@localhos ...

随机推荐

  1. 【结构型模式】《大话设计模式》——读后感 (12)在NBA我需要翻译?——适配器模式

    适配器模式:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能在一起工作的 那些类可以在一起工作了[DP] UML类图: 简单模拟一下代码: //已存在的.具有 ...

  2. Linux安装配置***客户端

    1.创建root用户 sudo passwd root su root 2.安装shadowsocks sudo apt-get install python-pip sudo pip install ...

  3. UVALive - 3942 (DP + Trie树)

    给出一个长度不超过300000的字符串 S,然后给出 n 个长度不超过100的字符串. 如果字符串可以多次使用,用这 n 个字符串组成 S 的方法数是多少? 比如样例中,abcd = a + b + ...

  4. C#语言入门

    1.基础知识 2.数据类型 3.控制语句 4.

  5. selenium2 页面对象模型Page Object

    开发Selenium WebDriver测试时,可以使用页面对象模型,这样可使得测试脚本有更高的可维护性,减少了重复的代码,把页面抽象出来.同时页面对象模型也提供了一个注释,帮助缓存远程,避免出现元素 ...

  6. BZOJ 4027: [HEOI2015]兔子与樱花

    贪心 #include<cstdio> #include<algorithm> using namespace std; int cnt,n,m,F[2000005],c[20 ...

  7. Python虚拟机之异常控制流(五)

    Python中的异常控制语义结构 在Python虚拟机之异常控制流(四)这一章中,我们考察了Python的异常在虚拟机中的级别上是什么东西,抛出异常这个动作在虚拟机的级别上对应的行为,最后,我们还剖析 ...

  8. TCP缓冲区大小及限制

    这个问题在前面有的部分已经涉及,这里在重新总结下.主要参考UNIX网络编程. (1)数据报大小IPv4的数据报最大大小是65535字节,包括IPv4首部.因为首部中说明大小的字段为16位.IPv6的数 ...

  9. github仓库主页介绍

  10. Spring-Boot自定义Starter实践

    此文已由作者王慎为授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. disconf-spring-boot-starter 使用方法: 引入maven依赖: <depen ...