shell sort 最后一列排序_没想到 Shell 命令竟然还能这么玩?| Shell 玩转大数据分析...

21048287963f793c600ad89da795c2dc.png1df1cda80af78f8a8b8b65bb675d8715.png

关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader。

正文开始

本文是一个命令行工具的综合应用,将用一个具体的例子来阐述如何用 Shell 来进行高效地数据统计和分析。最近北京又开始了新一批积分落户的填报工作,恰好这篇文章用 shell 来对首批北京积分落户同学进行 "大数据"分析。

现如今到处都是各种"大数据",本文分析对象也就是首批积分落户的6000多条数据而已,显然不能算什么大数据。

印象中,我记得当初该官网的这6000多条数据也是一次性就能wget下来的(后端估计没做限制,可能稍微调整下接口的分页参数之类不需要严格按照各种分页多次下载)。(注:本文旧文重新整理发送。)

问题描述

输入是 json数据,格式化之后的 json 数据主题结构如下所示,rows为数组,数组中元素所代表的 object 即描述了获得北京户口的同学的各种属性:例如分数、排名、身份证号(后四位打码了)、公司等等信息。为了方便大家练习对数据进行试验,我将文中的数据附在这里(https://www.tanglei.name/resources/use-shell-to-analysis-the-first-people-of-getting-residence-of-beijing-by-score/jifenluohu.json.gz)。

"rows": [
{
    "id": 62981,
    "idCard": "32092219721222****",
    "idCardSHA": "9ef70bde894959a4e4a1d1b2b9592b470294f9e4012a8cf480319665d1a7c1c6",
    "insertTime": 1539518353000,
    "integralQualified": 1,
    "internetAnnual": {
        "annual": 2018,
        "id": 43,
        "insertTime": 1539518353000,
        "publicityEnd": 1540224000000,
        "publicityStart": 1539591600000,
        "publishResultEndDate": 1541679300000,
        "publishResultStartDate": 1539591600000,
        "publishResultStatus": 1,
        "score": 90.75,
        "status": 1
    },
    "md5Code": "54e9ff7ce0b004f7141b157f8afc66db",
    "name": "杨效丰",
    "pxid": 1,
    "ranking": 1,
    "s1": 51,
    "s10": 0,
    "s2": 12.59,
    "s3": 15,
    "s4": 0,
    "s5": 4,
    "s6": 0,
    "s7": 20,
    "s8": 20,
    "s9": 0,
    "score": 122.59,
    "unit": "北京利德华福电气技术有限公司"
},

拿到这个文件,比如希望你用最快的方法获得以下信息,你将会怎么做?

  • 获取取得户口名额最多的top10公司
  • 获取取得户口名额的人中姓氏最多的
  • 获取户口名字中叫啥名最流行
  • 获取年龄分布
  • 获取取得户口的同学户籍地top10
  • 生肖/星座/生日...

当然,方法有很多,比如熟悉各种编程语言的,例如 python, php, java 等等写个简单的脚本程序,也能比较快获取答案。或者把相应的数据提取出来,放到 excel 中也可以。

如果你对 Shell 很熟悉,那真的是分分钟,应该是秒秒钟就能获取答案。就算用 Shell 来实现,不同的人可能也有不同的写法,后面我就列举其中的一种来解决这些问题。

本文不对 Shell 具体每个命令做过多的解释,不熟悉的同学可以直接 man $cmd 或者 $cmd --help 等等查看。

问题解答

获取取得户口名额最多的top10公司

看看想通过积分落户,最好是进哪些公司,哈哈。

"unit": "北京利德华福电气技术有限公司"

先通过 grep 得到包含公司名字的一行,然后通过 ":" 分割 cut 取第2列得到公司名字,对结果进行sort排序进行去重uniq统计得到重复次数,次时结果为重复次数 公司名,再对第一列-k 1重复数字进行按照数字排序逆序-nr 即 sort -nr -k 1,最后取结果的前10行 head -n 10

➜  积分落户  > grep 'unit' jifenluohu.json| cut -f2 -d: | sort | uniq -c | sort -nr -k 1 | head -n 10
 137  "北京华为数字技术有限公司"
  73  "中央电视台"
  57  "北京首钢建设集团有限公司"
  55  "百度在线网络技术(北京)有限公司"
  48  "联想(北京)有限公司"
  40  "北京外企人力资源服务有限公司"
  40  "中国民生银行股份有限公司"
  39  "国际商业机器(中国)投资有限公司"
  29  "中国国际技术智力合作有限公司"
  27  "华为技术有限公司北京研究所"

获取取得户口名额的人中姓氏最多的

看看想通过积分落户,最好是姓啥,哈哈。

"name": "杨效丰",

套路跟之前差不多的,我这边就不特别指出了。

下面shell实际上是取到这行后,将真正表示名字之前的所有字符都删除,就只剩下名字开头了,取行首第一个字符cut -c 1即得到姓,再按照之前的套路就能拿到了。

其实用什么sed替换冗余的字符都是多余的,因为json的格式都是良好的,可以直接通过 cut -c ? 取姓这个字符即可。

也不用挨个去数到底是第几个字符,直接 copy出来,然后 echo -n $paste | wc -c 就能数到第几个字符了。

看结果还是姓 "张, 王" 之类的最有戏。?

# 或者 grep '"name":' jifenluohu.json| sed 's|"name": "||g' | sed 's|[[:space:]]||g' | cut -c 1 | sort | uniq -c | sort -nr -k 1 | head -n 10
➜  积分落户  > grep '"name":' jifenluohu.json| sed 's|"name": "||g' | sed 's| ||g' | cut -c 1 | sort | uniq -c | sort -nr -k 1 | head -n 10
 541 张
 531 王
 462 李
 376 刘
 205 陈
 193 杨
 166 赵
 132 孙
  95 郭
  95 徐

获取户口名字中叫啥名最流行

套路差不多,不做过多解释了。

➜  积分落户  > grep '"name":' jifenluohu.json| sed 's|"name": "||g' | sed 's|[[:space:]]||g' | cut -c 2-4 | sort | uniq -c | sort -nr -k 1 | head -n 10
  51 伟",
  39 静",
  38 涛",
  36 勇",
  36 军",
  32 敏",
  31 颖",
  30 鹏",
  28 杰",
  28 峰",
# 取名字, 必须包含2个字
➜  积分落户  > grep '"name":' jifenluohu.json| sed 's|"name": "||g' | sed 's|[[:space:]]||g' | cut -c 2-3 | sed  '/"/d' | sort | uniq -c | sort -nr -k 1 | head -n 10
  19 海涛
  19 晓东
  12 志强
  11 海燕
  11 永强
  11 建华
  10 雪梅
   9 海龙
   9 丽娜
   8 洪涛

作为码农,必须得养成对自己得到结果进行自测的习惯,所以如果对自己的结果不够自信,可以正向去计算一下最终的结果。

例如可以简单grep一下进行验证,叫 "海涛" 的是不是19个。

➜  积分落户  > grep '海涛' jifenluohu.json | wc -l
      19  

获取年龄分布

思路是截取身份证中号码中代表出生年的4位数,然后拿当前年份2019减出生年得到年龄,后面的套路又一样了。

bc 一个简单的计算器程序,了解下?

➜  shell-train  > echo "3+2-5/5" | bc
4
➜  shell-train  > echo "3.141592*5-4" | bc
11.707960
#思路1: `cut -c 9-12` 获取出生年, 拼接表达式 `2019-出生年` 得到年龄.
➜  积分落户  > grep '"idCard":' jifenluohu.json| cut -f2 -d: | cut -c 9-12 | xargs -n1 echo 2019 -|bc | sort | uniq -c
   3 34
  13 35
  39 36
 109 37
 162 38
 302 39
 507 40
 773 41
 799 42
 813 43
 757 44
 586 45
 507 46
 378 47
 238 48
   4 49
   9 50
   1 51
   4 52
   3 53
   2 54
   5 55
   1 56
   1 58
   1 59
   1 60
   1 61

awk 是个好东西, 多练练.

# 拿到出生年后, 直接通过 awk 计算结果输出
➜  积分落户  > grep '"idCard":' jifenluohu.json| cut -f2 -d: | cut -c 9-12 |awk '{print 2019-$1}' | sort | uniq -c
   3 34
  13 35
  39 36
 109 37
 162 38
 302 39
 507 40
 773 41
 799 42
 813 43
 757 44
 586 45
 507 46
 378 47
 238 48
   4 49
   9 50
   1 51
   4 52
   3 53
   2 54
   5 55
   1 56
   1 58
   1 59
   1 60
   1 61   

获取取得户口的同学户籍地top10

有时候,我们在写Shell的时候,为了debug方便,可能会将一些中间结果缓存到文件中,后续以该文件为基础进行后续的计算。

比如先拿到top10的身份证中代表的户籍地的四位编码,这里需要借助另外的一个表示身份证户籍地的编码来进行对应。

借此机会解释下 join 这个命令。

# 身份证前4位为例, 拿到户籍地
grep '"idCard":' jifenluohu.json| cut -f2 -d: | cut -c 3-6 | sort | uniq -c | sort -nr -k 1 >topcity.code
# 城市列表
➜  积分落户  > more city.csv
11,北京市
1101,北京市市辖区
110101,北京市东城区
110102,北京市西城区
110103,北京市崇文区
110104,北京市宣武区
110105,北京市朝阳区
# grep -E '^[0-9]{4},' city.csv | sed 's|,| |g' > city.code4
➜ shell-train  > head -n 2 city.code4
1101 北京市市辖区
1102 北京市市辖县
➜ shell-train  > head -n 2 topcity.code
 197 1201
 156 1302
➜ shell-train  > join
usage: join [-a fileno | -v fileno ] [-e string] [-1 field] [-2 field]
            [-o list] [-t char] file1 file2

其实,join 就类似sql中的 ...inner join ...on ..., -t 分隔符,默认为空格或tab

# 未排序, 所以没有将所有的导出(join需要排序)
➜ shell-train  > join -1 1 -2 2 city.code4 topcity.code
1201 天津市市辖区 197
1302 河北省唐山市 156
2301 黑龙江哈尔滨市 123
4201 湖北省武汉市 118
6101 陕西省西安市 100
6201 甘肃省兰州市 59
6501 新疆乌鲁木齐市 29
6523 新疆昌吉回族自治州 11

一定需要将结果输出到文件,然后再进行吗?

其实也不一定。用管道的方式 | 可以将上一个命令的输出结果作为下一个命令的输入,可以通过  的方式,将command 的输出作为一个文件输入。

# 需要排序
➜ shell-train  > join -1 1 -2 2 city.code4 1201 天津市市辖区 197
1301 河北省石家庄市 114
1302 河北省唐山市 156
1324 河北省保定地区 103
1501 内蒙古呼和浩特市 88
2101 辽宁省沈阳市 109
2201 吉林省长春市 113
2301 黑龙江哈尔滨市 123
4201 湖北省武汉市 118
6101 陕西省西安市 100

举个例子paste用来将两个文件按列合并在一起:

➜  shell-train  > cat paste.f1
hello, i am
world, you are
➜  shell-train  > cat paste.f2
tanglei, wechat is: tangleithu
?, hahaha
➜  shell-train  > paste paste.f1 paste.f2
hello, i am tanglei, wechat is: tangleithu
world, you are ?, hahaha

以上用paste将两个文件合并在一起了,实际上通过 的方式,可以不借助外部文件也能做到。

方法如下:

➜  shell-train  > paste echo "hello, i am \nworld, you are") echo "tanglei, wechat is: tangleithu\n?, hahaha")
hello, i am  tanglei, wechat is: tangleithu
world, you are ?, hahaha

其他的任务交给你了

这里就不重复多讲了,剩下的问题,要不你动手试试,比如看看生日最多的?

再试试获取 生肖/星座 最多的top10。

有任何疑问,欢迎留言交流参与交流讨论。

88ea04166489875d6e97dce3ad404581.gif

良许个人微信

添加良许个人微信即送3套程序员必读资料

→ 精选技术资料共享

→ 高手如云交流社群

271c3021e9bf0d5bd509f0b8c4eb5e16.png


本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!

推荐阅读:

微软又发布了一款命令行神器!!!

如何向纯洁的女朋友解释并发与并行的区别?

如何设置与查看Linux系统中的环境变量?

5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!

38c514d69a5cc83900b4de0541b9b587.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于不是特别擅长Photoshop的人来说,熟悉和运用Photoshop工具提供的各类便捷的快捷键,是有帮助的。...

应用程序菜单快捷键之文件 应用程序菜单快捷键之编辑 应用程序菜单快捷键之图像图层 应用程序菜单快捷键 应用程序菜单快捷键之视图 Ctrl H 取消参考线调板菜单快捷键一览。 工具板快捷键一览 其他类别的快捷键。 按Shift时可画出正圆和方形的选区、图形、直线。 按Shift时可…

懂数学人的都认同:数学的本质[关联]万物(二)

来源:数学职业家结构、关系与信息关系是与结构绑定的不可分割的,是对结构从某个视角观察的结果,并且这个角度看到的是可以被观察者所理解和可感知的。这里的可感知,即是可以被人体的感觉系统(如视觉、听觉、触觉等&…

计算虚拟化涉及的关键技术有哪几项_都开始商用了 5G的这些关键技术还不知道?...

[PConline 杂谈]作为新一代移动通信技术,5G为我们带来了更高的数据速率与更低的延迟,甚至比4G快了100倍。在满足移动超高清视频、AR/VR等大流量应用的同时,更将开启万物互联、深度融合的发展新阶段。如果说3G提升了速度,4G改变了生…

沃丰报告:物联网的未来

物联网的未来激动人心,但物联网并不只为那些极具创新精神的创业企业而生。大多数物联网项目都不是为了创造头条新闻,而是为了做出切实的成果。我相信我们已经越过了临界点,物联网已经成为主流。来源 | 沃达丰物联网近日,沃达丰(vo…

推销员(codevs 5126)

题目描述 Description阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有N家住户,第i家住户到入口的距离为Si米。由于同一栋房…

python管理系统web版_Python学生管理系统(web网页版)-Go语言中文社区

前言:本项目是使用Python的Django的web框架搭建的,是一个完整的学生管理系统,功能包括基本的增删改查 项目演示图: 首页展示数据的页面(index.html)添加学生的页面(add.html)搜索学生…

hog函数的用法 python_Python常见内置函数用法(三)

本文作者:孙雪丽文字编辑:周聪聪技术总编:张学人重大通知!!!2019年6月22日至24日在河南郑州举行Stata编程技术特别训练营,招生工作已经圆满结束。另外爬虫俱乐部将于2019年7月5日至7月8日在武汉…

pytorch打印模型每层的结构

可以用torchsummary下的summary方法,或者torchinfo下的summary方法,两者功能是一样的 以torchsummary下的summary方法为例说明 首先通过pip install torchsummary 之后在代码中: from torchsummary import summarysummary(model, (1, 28,…

学会动态丨中国人工智能学会成功召开重大科学问题《智能生成机理》研讨会...

来源:中国人工智能学会为配合国家科技发展的重大需求,推进重大科学问题的研究,形成相应的政策建议,中国人工智能学会于9月29日上午9时在北邮科技大厦召开了“重大科学问题《智能生成机理》研讨会”。现场专家们通过深入交流&#…

Linux文件(区域)锁函数 -- open()、fcntl()

一、什么是文件锁定 对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用,现在世界中的锁的功能都可归结为一句话,就是阻止某些人做某些事,例如,门锁就是…

**Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...

何谓悲观锁与乐观锁悲观锁乐观锁两种锁的使用场景乐观锁常见的两种实现方式1. 版本号机制2. CAS算法乐观锁的缺点1 ABA 问题2 循环时间长开销大3 只能保证一个共享变量的原子操作CAS与synchronized的使用情景何谓悲观锁与乐观锁乐观锁对应于生活中乐观的人总是想着事情往好的方…

现代版的大案牍术:数字孪生在城市的应用

来源:阿里研究院最近大火的电视剧《长安十二时辰》中,靖安司大规模启用秘密核武器——大案牍术,书吏们从各个部门汇总来的人员往来、钱粮货物流水中寻找到蛛丝马迹甚至未卜先知,再结合长安版的5G通讯——望楼通信与大沙盘&#xf…

关于样式表setStyleSheet

在Qt中设置widget背景颜色或者图片方法很多种:重写paintEvent() , 调色板QPalette , 样式表setStyleSheet等等。 但是各种方法都有其注意事项,如果不注意则很容易陷入麻烦中。 1:setStyleSheet() 这个函数我一直很喜欢使用,因为只…

react打包后图片丢失_使用 webpack 搭建 React 项目

简评:相信很多开发者在入门 react 的时候都是使用 create-react-app 或 react-slingshot 这些脚手架来快速创建应用,当有特殊需求,需要修改 eject 出来的 webpack 配置文件时,面对各种配置项不知如何下手,本文会介绍如…

揭秘5G+AI时代的机器人世界!七大核心技术改变人类生活【附下载】| 智东西内参...

来源: 智东西AI 和 5G 与机器人技术结合,正在不断催生新的消费电子品类。AI 解决机器理解世界,以及人机交互的问题。5G 拓展机器人的活动边界,并为机器人提供更大的算力和存储空间(云协作机器人) 。根据 IF…

python方向键控制角色_用python和pygame游戏编程入门-控制角色移动

在上一节中我们知道了事件,以及如何捕捉键盘事件进行响应,本届我们结合第一节何上一节的内容,做一个用键盘控制角色移动的功能,代码如下: #!/usr/bin/env python #指定图像文件名称 background_image_filename ./img/…

让人工智能有情感的秘诀!清华权威报告看透情感计算【附下载】

来源: 智东西40 多年前,诺贝尔奖得主 Herbert Simon 在认知心理学方面强调,解决问题论要结合情感的影响。情感的识别和表达对于信息的交流和理解是必需的,也是人类最大的心理需求之一。人类的认知、行为等几乎都要受到情感的驱动&…

记录用户转成超级用户的文件名字_一分钟了解Linux用户

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资…

重磅!2019年诺贝尔生理学或医学奖揭晓,“细胞感知氧气通路”摘得桂冠

来源:奇点网北京时间2019年10月7日17点30分,2019年诺贝尔生理学或医学奖揭晓,得主为William G. Kaelin Jr,Peter J. Ratcliffe和Gregg L. Semenza,获奖理由为“他们发现了细胞如何感知和适应氧气供应”。William G. Ka…