九个命令行工具帮助在Linux中进行数据分析是首选。但是命令行工具也可以更快、更有效地解决问题——而且学习曲线很小。这些工具中的大多数都严格限于Linux,但大多数也可以在Unix甚至Windows环境中运行。在今天的文章中,我们将试用一些简单的开源数据分析工具,并共同了解它们的工作原理。1.Headandtail首先,让我们从文件处理开始。文件里有什么?格式是什么?可以使用cat命令在终端显示文件,但显然不适合长文件。输入head和tail,这两个都可以完整显示文件中指定行数的内容。如果不指定行数,默认显示10行。$tail-n3jan2017articles.csv02Jan2017,文章,ScottNesbitt,有效使用wikisford文档的3个技巧,1,/article/17/1/tips-using-wiki-documentation,“文档,Wiki”,71002Jan2017,文章,JenWikeHuger,TheOpensource.compreviewforJanuary/17/1/editorial-preview-january,,35802Jan2017,Poll,JasonBaker,WhatisyouropensourceNewYearsresolution?,1,/poll/17/1/what-your-open-source-new-years-resolution,,186在最后的三行中,我找到了日期、作者姓名、标题和一些其他信息。但是,由于没有列标题,我不知道每一列的具体含义。我们来看看每一列的具体标题:$head-n1jan2017articles.csvPostdate,Contenttype,Author,Title,Commentcount,Path,Tags,Wordcount现在一切都很清楚了,我们可以看到出版日期,内容类型,作者,标题,每篇文章的提交数量、相对URL、标签和字数。2.wc但是如果你需要分析成百上千篇文章,那怎么办呢?这里需要用到wc命令——它是单词“wordcount”的缩写。wc可以计算文件的字节数、字符数、单词数或行数。在这个例子中,我们想知道一篇文章的行数。$wc-ljan2017articles.csv93jan2017articles.csv这个文件一共93行。考虑到第一行包含文件标题,可以推测这个文件是一个包含92篇文章的列表。第三,grep提出了一个新问题:这些文章中有多少与安全主题相关?为了达到这个目的,我们假设要求的文章会在标题、标签或其他地方提到安全这个词。此时,grep工具可用于按特定字符搜索文件或实现其他搜索模式。这是一个非常强大的工具,因为我们甚至可以使用正则表达式来创建极其精确的匹配模式。但是在这里,我们只需要找到一个简单的字符串。$grep-i"security"jan2017articles.csv30Jan2017,Article,TiberiusHefflin,4waystoimproveyoursecurityonlinerightnow,3,/article/17/1/4-ways-improve-your-online-security,Securityandencryption,124228Jan2017,Article,SubhashishPanigrahi,印度社区如何支持,隐私0,软件自由/article/17/1/how-communities-india-support-privacy-software-freedom,Securityandencryption,45327Jan2017,Article,AlanSmithee,DataPrivacyDay2017:Solutionsforeverydayprivacy,5,/article/17/1/every-day-privacy,"大数据,Securityandencryption",142404Jan2017,Article,DanielJWalsh,50waystoavoidgettinghackedin2017,14,/article/17/1/yearbook-50-ways-avoid-getting-hacked,"年鉴,2016OpenSourceYearbook,Securityandencryption,3Linux,Containers,2Docker1格式为grepplus-i标志(告诉grep不区分大小写),加上我们要搜索的模式,最后是我们要搜索的目标文件的位置。最后我们找到了4篇安全相关的文章。如果范围搜索更具体ic,我们可以使用管道——它可以结合grep和wc命令来知道有多少行提到了安全内容。$grep-i"security"jan2017articles.csv|wc-l4这样,wc将提取grep命令的输出并将其用作输入。显然,这种组合加上一点shell脚本,立即将终端变成了强大的数据分析工具。4.tr在大多数分析场景中,我们都会面对CSV文件——但是我们如何将它们转换成其他格式来实现不同的应用方式呢?这里,我们将它们转换成HTML形式,通过表格来进行数据使用。tr命令可以帮助您实现这个目标,它可以将一种类型的字符转换为另一种类型。同样,你也可以配合pipe命令来实现输出/输入对接。接下来,让我们尝试另一个多部分示例,创建一个仅包含1月20日发布的文章的TSV(制表符分隔值)文件。$grep"20Jan2017"jan2017articles.csv|tr',''\t'>jan20only.tsv首先,我们使用grep进行日期查询。我们将此结果通过管道传递给tr命令,并使用后者将所有逗号替换为制表符(表示为“\t”)。但是结果去哪儿了?这里我们使用>字符将结果输出到新文件而不是屏幕结果。这样,我们就可以保证dqywjan20only.tsv文件一定包含了预期的数据。$catjan20only.tsv20Jan2017ArticleKushalDas5waystoexpandyourproject'scontributorbase2/article/17/1/expand-project-contributor-baseGettingstarted69020Jan2017ArticleDRuthBavousettHowtowritewebappsinRwithShiny2/article/17/1/writing-new-web-apps-shinyWebdevelopment21820Jan2017ArticleJasonBaker"Top5:ShellscriptingtheCinnamonLinuxdesktopenvironmentandmore"0/article/17/1/top-5-january-20Top521420Jan2017ArticleTracyMirandaHoisyourcommunitypromotingdiversity?1/article/17/1/take-action-diversity-techDiversityandinclusion10075.排序如果我们首先需要找到包含最多信息的特定栏目,我们应该如何操作?假设我们需要知道哪一篇文章包含最长的新文章列表,那么面对之前获取的1月20日的文章列表,我们可以使用sort命令对列中的单词数进行排序。在这种情况下,我们不需要使用中间文件,可以继续使用管道。然而,将长命令链分成较短的部分通常可以简化整体操作。$sort-nr-t$'\t'-k8jan20only.tsv|head-n120Jan2017ArticleTracyMirandaHowisyourcommunitypromotingdiversity?1/article/17/1/take-action-diversity-techDiversityandinclusion1007上面是一个很长的命令,我们尝试拆分一下。首先,我们使用sort命令对字数进行排序。-nr选项告诉sort按数字排序并反转结果(从大到小)。随后的-t$'\t'告诉sort分隔符是tab('\t')。$要求shell是需要处理的字符串,并返回\n作为制表符。-k8部分告诉排序命令使用第八列,这是本例中字数统计的目标列。最后通过管道将输出输出到head,经过处理后,在结果中显示本文件中单词最多的文章标题。六、sed你可能还需要选择文件中的特定行。这里可以使用sed。如果要合并多个都包含表头的文件,并且只显示整个文件的一组表头,则需要去除多余的内容;或者你只想提取特定的行范围,你也可以使用sed。此外,sed还可以很好地执行批量搜索和替换任务。接下来,根据之前的文章列表,新建一个没有标题的文件,用于合并其他文件(比如我们每个月定时生成某个文件,现在需要合并每个月的内容)。$sed'1d'jan2017articles.csv>jan17no_headers.csv其中“1d”选项要求sed删除第一行。七、切知道了删除行,那么我们如何删除列呢?或者如何只选择某一列?让我们尝试为之前生成的列表创建一个新的作者列表。$cut-d','-f3jan17no_headers.csv>authors.txt在这里,cut和-d的组合意味着我们需要第三列(-f3)并将结果发送到名为authors.txt的新文件。8.uniq作者列表已经完成,但是我们如何知道其中包含了多少不同的作者?每个作者写了多少篇文章?这里使用了uniq。接下来,我们对文件进行排序以找到唯一值,然后计算每个作者的文章数量,并用结果替换原始内容。sortauthors.txt|uniq-c>authors.txt现在可以看到每个作者对应的文章数,检查最后三行确保结果正确。$tail-n3authors-sorted.txt1TracyMiranda1VeerMuchandi3VM(Vicky)Brasseur九、awk最后给大家介绍一下最后一个工具,awk。awk是一个优秀的替代工具,当然它的功能远不止于此。接下来,我们返回1月12日文章列表的TSV文件,使用awk新建一个列表,标明每篇文章的作者,以及每个作者写的具体字数。$awk-F"\t"'{print$3""$NF}'jan20only.tsvKushalDas690DRuthBavousett218JasonBaker214TracyMiranda1007-F"\t"用于通知awk它当前正在处理由制表符分隔的数据。在大括号内,我们为awk提供了要执行的代码。$3表示输出第三行,$NF表示输出最后一行(即'numberoffields'的缩写),并在两个结果之间加两个空格,以便明确划分。虽然此处提供的示例足够小,似乎不需要使用上述工具来解决,但如果将范围扩展到包含93,000行的文件,使用电子表格程序显然太难处理了。有了这些简单的工具和小脚本,就可以避免使用数据库工具,轻松完成大量的统计工作。无论您是专业人士还是业余爱好者,它的作用都不可忽视。原标题:Linux中数据分析的9个命令行工具,作者:JasonBaker
