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

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. mysql替换表中某字段的某值

    UPDATE  `cases`  SET  `case_desc` = replace(`case_desc`, 'src="//tuku-assets.m.jia.com/assets/i ...

  2. linux下GPIO的用户层操作(sysfs)

    linux的GPIO通过sysfs为用户提供服务,下面是linux kernel里的说明文档,学习一下. GPIO Sysfs Interface for Userspace ============ ...

  3. Linux扩增卷组、逻辑卷以及缩减逻辑卷

    今天我们将了解怎样来扩展卷组,扩展和缩减逻辑卷.在这里,我们可以缩减或者扩展逻辑卷管理(LVM)中的分区,LVM也可称之为弹性卷文件系统. 前置需求使用LVM创建弹性磁盘存储——第一部分 什么时候我们 ...

  4. light oj 1104 Birthday Paradox (概率题)

    Sometimes some mathematical results are hard to believe. One of the common problems is the birthday ...

  5. HDU:2255-奔小康赚大钱(KM算法模板)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Mem ...

  6. python for data analysis chapter1~2

    Q1:numpy与series的区别:index Tab补全(任意路径Tab) 内省(函数:?显示文档字符串,??显示源代码:结合通配符:np.* load *?) %load .py ctrl-c( ...

  7. Oracle数据库的日常使用命令

    1.     启动和关闭数据库 sqlplus /nolog; SQL >conn / as sysdba;(上面的两条命令相当于sqlplus ‘/as sysdba’) SQL >st ...

  8. python之路 --- python基础

    一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...

  9. 算法理论——PLA

    全称 perceptron learning algrithm 用武之地 二值分类问题,资料线性可分 算法核心(以二维平面为例) 找到一条直线WTX=0,一边全为+1,另一边全为-1.找到了这条线(即 ...

  10. URAL 1137Bus Routes (dfs)

    Z - Bus Routes Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...