对于大多数熟悉了图形工作环境的朋友来说,电子表格工具无疑是第一选项。但命令行工具同样能够更快更高效地解决问题——且只须稍微学习即可上手。

大部分此类工具冻严格局限于Linux,而多数可同样运行在Unix甚至是Windows环境之下。在今天的文章中,我们将尝试几款简单的开源数据分析工具,并共同了解其如何运作。

一、head与tail

首先,让我们先从文件处理开始。文件中有什么内容?其格式如何?大家可以使用cat命令在终端中显示文件,但其显然不适合处理内容较长的文件。

输入head与tail,二者能够完整显示文件中的指定行数内容。如果大家未指定行数,则默认显示其中10行。

  1. $ tail -n 3 jan2017articles.csv
  2. 02 Jan 2017,Article,Scott Nesbitt,3 tips for effectively using wikis for documentation,1,/article/17/1/tips-using-wiki-documentation,"Documentation, Wiki",710
  3. 02 Jan 2017,Article,Jen Wike Huger,The Opensource.com preview for January,0,/article/17/1/editorial-preview-january,,358
  4. 02 Jan 2017,Poll,Jason Baker,What is your open source New Year's resolution?,1,/poll/17/1/what-your-open-source-new-years-resolution,,186

在最后三行中,我能够找到日期、作者姓名、标题以及其他一些信息。不过由于缺少列头,我不清楚各列的具体含义。下面查看各列的具体标题:

  1. $ head -n 1 jan2017articles.csv
  2. Post date,Content type,Author,Title,Comment count,Path,Tags,Word count

现在一切都非常明确,我们可以看到发布日期、内容类型、作者、标题、提交次数、相关URL、各文章标签以及字数。

二、wc

但如果需要分析数百甚至上千篇文章,又该如何处理?这里就要使用wc命令了——其为“字数”一词的缩写。wc能够对文件的字节、字符、单词或者行数进行计数。在本示例中,我们希望了解文章中的行数。

  1. $ wc -l jan2017articles.csv 93 jan2017articles.csv

本文件共有93行,考虑到第一行中包含文件标题,因此可以推测此文件是一份包含92篇文章的列表。

三、grep

下面提出新的问题:其中有多少篇文章与安全话题有关?为了实现目标,我们假定需要的文章会在标题、标签或者其他位置提到安全这一字眼。这时,grep工具可用于通过特定字符搜索文件或者实现其他搜索模式。这是一款极为强大的工具,因为我们甚至能够利用正则表达式建立极为精确的匹配模式。不过这里,我们只需要寻找一条简单的字符串。

  1. $ grep -i "security" jan2017articles.csv
  2. 30 Jan 2017,Article,Tiberius Hefflin,4 ways to improve your security online right now,3,/article/17/1/4-ways-improve-your-online-security,Security and encryption,1242
  3. 28 Jan 2017,Article,Subhashish Panigrahi,How communities in India support privacy and software freedom,0,/article/17/1/how-communities-india-support-privacy-software-freedom,Security and encryption,453
  4. 27 Jan 2017,Article,Alan Smithee,Data Privacy Day 2017: Solutions for everyday privacy,5,/article/17/1/every-day-privacy,"Big data, Security and encryption",1424
  5. 04 Jan 2017,Article,Daniel J Walsh,50 ways to avoid getting hacked in 2017,14,/article/17/1/yearbook-50-ways-avoid-getting-hacked,"Yearbook, 2016 Open Source Yearbook, Security and encryption, Containers, Docker, Linux",2143

我们使用的格式为grep加-i标记(告知grep不区分大小写),再加我们希望搜索的模式,最后是我们所搜索的目标文件的位置。最后我们找到了4篇安全相关文章。如果搜索的范围更加具体,我们可以使用pipe——它能够将grep同wc命令加以结合,用以了解其中有多少行提到了安全内容。

  1. $ grep -i "security" jan2017articles.csv | wc -l 4

这样,wc会提取grep命令的输出结果并将其作为输入内容。很明显,这种结合再加上一点shell脚本,终端将立即变成一款强大的数据分析工具。

四、tr

在多数分析场景下,我们都会面对CSV文件——但我们该如何将其转换为其他格式以实现不同应用方式?这里,我们将其转化为HTML形式以通过表格进行数据使用。tr命令可帮助大家实现这一目标,它可将一类字符转化为另一类。同样的,大家也可以配合pipe命令实现输出/输入对接。

下面,我们试试另一个多部分示例,即创建一个TSV(即制表符分隔值)文件,其中只包含发表于1月20日的文章。

  1. $ grep "20 Jan 2017" jan2017articles.csv | tr ',' '\t' > jan20only.tsv

首先,我们利用grep进行日期查询。我们将此结果pipe至tr命令,并利用后者将全部逗号替换为tab(表示为‘\t’)。但结果去哪了?这里我们使用〉字符将结果输出为新文件而非屏幕结果。如此一来,我们可以dqywjan20only.tsv文件中一定包含预期的数据。

  1. $ cat jan20only.tsv 20 Jan 2017 Article Kushal Das 5 ways to expand your project's contributor base 2 /article/17/1/expand-project-contributor-base Getting started 690 20 Jan 2017 Article D Ruth Bavousett How to write web apps in R with Shiny 2 /article/17/1/writing-new-web-apps-shiny Web development 218 20 Jan 2017 Article Jason Baker "Top 5: Shell scripting the Cinnamon Linux desktop environment and more" 0 /article/17/1/top-5-january-20 Top 5 214 20 Jan 2017 Article Tracy Miranda How is your community promoting diversity? 1 /article/17/1/take-action-diversity-tech Diversity and inclusion 1007

五、sort

如果我们先要找到包含信息最多的特定列,又该如何操作?假设我们需要了解哪篇文章包含最长的新文章列表,那么面对之前得出的1月20日文章列表,我们可以使用sort命令对列字数进行排序。在这种情况下,我们并不需要使用中间文件,而可以继续使用pipe。不过将长命令链拆分成较短的部分往往能够简化整个操作过程。

  1. $ sort -nr -t$'\t' -k8 jan20only.tsv | head -n 1
  2. 20 Jan 2017 Article Tracy Miranda How is your community promoting diversity? 1 /article/17/1/take-action-diversity-tech Diversity and inclusion 1007

以上是一条长命令,我们尝试进行拆分。首先,我们使用sort命令对字数进行排序。-nr选项告知sort以数字排序,并将结果进行反向排序(由大到小)。此后的-t$'\t'则告知sort其中的分隔符为tab(‘\t’)。其中的$要求此shell为一条需要处理的字符串,并将\n返回为tab。而-k8部分则告知sort命令使用第八列,即本示例中进行字数统计的目标列。

最后,输出结果被pipe至head,处理后在结果中显示此文件中包含最多字数的文章标题。

六、sed

大家可能还需要在文件中选择特定某行。这里可以使用sed。如果希望将全部包含标题的多个文件加以合并,并只为整体文件显示一组标题,即需要清除额外内容; 或者希望只提取特定行范围,同样可以使用sed。另外,sed还能够很好地完成批量查找与替换任务。

下面立足之前的文章列表创建一个不含标题的新文件,用于同其他文件合并(例如我们每月都会定期生成某个文件,现在需要将各个月份的内容进行合并)。

  1. $ sed '1 d' jan2017articles.csv > jan17no_headers.csv

其中的“1 d”选项要求sed删除第一行。

七、cut

了解了如何删除行,那么我们该如何删除列?或者说如何只选定某一列?下面我们尝试为之前生成的列表创建一份新的作者清单。

  1. $ cut -d',' -f3 jan17no_headers.csv > authors.txt

在这里,通过cut与-d相配合代表着我们需要第三列(-f3),并将结果发送至名为authors.txt的新文件。

八、uniq

作者清单已经完成,但我们要如何知悉其中包含多少位不同的作者?每位作者又各自编写了多少篇文章?这里使用uniq。下面我们对文件进行sort排序,找到唯一值,而后计算每位作者的文章数量,并用结果替换原本内容。

  1. sort authors.txt | uniq -c > authors.txt

现在已经可以看到每位作者的对应文章数,下面检查最后三行以确保结果正确。

  1. $ tail -n3 authors-sorted.txt
  2. 1 Tracy Miranda
  3. 1 Veer Muchandi
  4. 3 VM (Vicky) Brasseur

九、awk

最后让我们了解最后一款工具,awk。awk是一款出色的替换性工具,当然其功能远不止如此。下面我们重新回归1月12日文章列表TSV文件,利用awk创建新列表以标明各篇文章的作者以及各作者编写的具体字数。

  1. $ awk -F "\t" '{print $3 " " $NF}' jan20only.tsv
  2. Kushal Das 690
  3. D Ruth Bavousett 218
  4. Jason Baker 214
  5. Tracy Miranda 1007

其中的-F "\t"用于告知awk目前处理的是由tab分隔的数据。在大括号内,我们为awk提供执行代码。$3代表要求其将输出第三行,而$NF则代表输出最后一行(即‘字段数’的缩写),并在两项结果间添加两个空格以进行明确划分。

虽然这里列举的例子规模较小,看似不必使用上述工具解决,但如果将范围扩大到包含93000行的文件,那么它显然很难利用电子表格程序进行处理。

利用这些简单的工具与小型脚本,大家可以避免使用数据库工具并轻松完成大量数据统计工作。无论您是专业人士还是业余爱好者,它的作用都不容忽视。

原文标题:9command-line tools for data analysis in Linux,作者:Jason Baker

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

九款命令行工具助力Linux环境下的数据分析的更多相关文章

  1. 20个命令行工具监控Linux系统性能

    作为Linux/Unix 系统管理员需要掌握一些常用的工具用于检测系统性能.在这里,dodo为大家推荐非常20个有用的并且最常用的命令行系统监视工具: 1. top -Linux系统进程监控 top ...

  2. 20个命令行工具监控 Linux 系统性能(转载)

    1. top — Linux 系统进程监控 top 命令是性能监控程序,它可以在很多 Linux/Unix 版本下使用,并且它也是 Linux 系统管理员经常使用的监控系统性能的工具.Top 命令可以 ...

  3. 几款命令行工具(CMD)增强软件

    如果经常要与 命令行工具(CMD)打交道,推荐几款工具来增强与替代 Windows 默认的 CMD. 1.PowerCMD 优点:老牌软件,功能强大,支持自定义配色方案,目前最新版本为 2.2: 缺点 ...

  4. 20个命令行工具监控 Linux 系统性能

    对于每个系统管理员或网络管理员来说,每天要监控和调试 Linux 系统性能问题都是非常困难的工作.我已经有5年 Linux 管理员的工作经历,知道如何监控系统使其保持正常运行.为此,我们编写了对于 L ...

  5. 20个命令行工具监控 Linux 系统性能【转载】

    对于每个系统管理员或网络管理员来说,每天要监控和调试 Linux 系统性能问题都是非常困难的工作.我已经有5年 Linux 管理员的工作经历,知道如何监控系统使其保持正常运行.为此,我们编写了对于 L ...

  6. 监控 Linux 系统的 7 个命令行工具

    监控 Linux 系统的 7 个命令行工具: " 深入 关于Linux最棒的一件事之一是你能深入操作系统,来探索它是如何工作的,并寻找机会来微调性能或诊断问题.这里有一些基本的命令行工具,让 ...

  7. 吻逗死(windows)系统下自动部署脚本(for java spring*)及linux命令行工具

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10051647.html (^^)(^^)自動部署腳本原本在上個公司就在使用,由於近期同事需要手動部署一個Spr ...

  8. JVM总结之命令行工具

    jps jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号. jps相当于Solaris进程工具ps.不象"pgrep java"或"ps ...

  9. Linux 环境下一些常用命令(四)

    转自 http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users 31. 命令: rm 'rm ...

随机推荐

  1. 【ElasticSearch】ES5新特性-keyword-text类型-查询区别

    ES5新特性-keyword-text类型-查询区别 elasticsearch-head Elasticsearch-sql client junneyang (JunneYang) es keyw ...

  2. hadoop集群默认配置和常用配置

    http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html 获取默认配置 配置hadoop,主要是配置core-site.xml, ...

  3. 最全的spark基础知识解答

    原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...

  4. 持续集成之代码质量管理-Sonar [三]

    转载:https://www.abcdocker.com/abcdocker/2053 摘要 Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工 ...

  5. C++ 多态的原理

    1.多态解决什么问题? 面向抽象编程,用户不需要关心引用或者指针的真实类型,已经内部实现.2.C++ 要具备多态的性质,满足两个条件:表面类型和真实类型不一样,方法是虚方法.3.多态是如何实现的? 实 ...

  6. my.cnf配置文件参数解释

    lower_case_table_names=1#去掉大小写敏感 [client] port = 3309 socket = /home/mysql/mysql/tmp/mysql.sock [mys ...

  7. python xlwt写excel格式控制 颜色、模式、编码、背景色

    关于写excel的格式控制,比如颜色等等 import xlwt from datetime import datetime font0 = xlwt.Font() font0.name = 'Tim ...

  8. Webwork【01】Webwork与 Struct 的前世今生

    Struts 1是全世界第一个发布的MVC框架,它由Craig McClanahan在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,经过长达6年时间的锤炼,Struts ...

  9. Spring MVC 零配置 / Spring MVC JavaConfig

    1. Spring MVC的核心就是DispatcherServlet类,Spring MVC处理请求的流程如下图所示: 2. Spring MVC中典型的上下文层次 当我们初始化一个Dispatch ...

  10. Software development --daily scrum team

    History[edit] Scrum was first defined as "a flexible, holistic product development strategy whe ...