Swift51.com
麦子学院 头像
麦子学院  2017-03-02 14:10

Linux数据分析必备的9个命令行工具

回复:0  查看:2163  
对于大多数熟悉了图形工作环境的朋友来说,电子表格工具无疑是第一选项。但命令行工具同样能够更快更高效地解决问题—— 且只须稍微学习即可上手。
  大部分此类工具冻严格局限于 Linux系统 ,而多数可同样运行在Unix 甚至是 Windows 环境之下。在今天的文章中,我们将尝试几款简单的开源数据分析工具,并共同了解其如何运作。
   一、headtail
  首先,让我们先从文件处理开始。文件中有什么内容? 其格式如何 ? 大家可以使用 cat 命令在终端中显示文件,但其显然不适合处理内容较长的文件。
  输入head tail ,二者能够完整显示文件中的指定行数内容。如果大家未指定行数,则默认显示其中 10 行。
  $ tail -n 3 jan2017articles.csv 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 02 Jan 2017,Article,Jen Wike Huger,The Opensource.com preview  forJanuary,0,/article/17/1/editorial-preview-january,,358 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
  在最后三行中,我能够找到日期、作者姓名、标题以及其它一些信息。不过由于缺少列头,我不清楚各列的具体含义。下面查看各列的具体标题:
  $ head -n 1 jan2017articles.csv
  Post date,Content type,Author,Title, Comment  count, Path,Tags,Word  count
  现在一切都非常明确,我们可以看到发布日期、内容类型、作者、标题、提交次数、相关URL 、各文章标签以及字数。
   二、wc
  但如果需要分析数百甚至上千篇文章,又该如何处理? 这里就要使用 wc 命令了 —— 其为 字数 一词的缩写。 wc 能够对文件的字节、字符、单词或者行数进行计数。在本示例中,我们希望了解文章中的行数。
  $ wc -l jan2017articles.csv 93 jan2017articles.csv
  本文件共有93 行,考虑到第一行中包含文件标题,因此可以推测此文件是一份包含 92 篇文章的列表。
   三、grep
  下面提出新的问题:其中有多少篇文章与安全话题有关? 为了实现目标,我们假定需要的文章会在标题、标签或者其它位置提到安全这一字眼。这时, grep 工具可用于通过特定字符搜索文件或者实现其它搜索模式。这是一款极为强大的工具,因为我们甚至能够利用正则表达式建立极为精确的匹配模式。不过这里,我们只需要寻找一条简单的字符串。
  $ grep -i "security" jan2017articles.csv 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 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 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 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 命令加以结合,用以了解其中有多少行提到了安全内容。
  $ grep -i "security" jan2017articles.csv | wc -l 4
  这样,wc 会提取 grep 命令的输出结果并将其作为输入内容。很明显,这种结合再加上一点 shell 脚本,终端将立即变成一款强大的数据分析工具。
   四、tr
  在多数分析场景下,我们都会面对CSV 文件 —— 但我们该如何将其转换为其它格式以实现不同应用方式 ? 这里我们将其转化为 HTML 形式以通过表格进行数据使用。 tr 命令可帮助大家实现这一目标,其可将一类字符转化为另一类。同样的,大家也可以配合 pipe 命令实现输出 / 输入对接。
  下面我们试试另一个多部分示例,即创建一个TSV( 即制表符分隔值 ) 文件,其中只包含发表于 1 20 日的文章。
  grep "20 Jan 2017" jan2017articles.csv |  tr ',' '\t' > jan20only.tsv
  首先,我们利用grep 进行日期查询。我们将此结果 pipe tr 命令,并利用后者将全部逗号替换为 tab( 表示为 ‘\t’) 。但结果去哪了 ? 这里我们使用〉字符将结果输出为新文件而非屏幕结果。如此一来,我们可以 dqywjan20only.tsv 文件中一定包含预期的数据。
  $ 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 。不过将长命令链拆分成较短的部分往往能够简化整个操作过程。
  sort -nr -t$'\t' -k8 jan20only.tsv | head -n 1 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 还能够很好地完成批量查找与替换任务。
  下面立足之前的文章列表创建一个不含标题的新文件,用于同其它文件合并( 例如我们每月都会定期生成某个文件,现在需要将各个月份的内容进行合并 )
  $ sed '1 d' jan2017articles.csv > jan17no_headers.csv
  其中的“1 d” 选项要求 sed 删除第一行。
   七、cut
  了解了如何删除行,那么我们该如何删除列? 或者说如何只选定某一列 ? 下面我们尝试为之前生成的列表创建一份新的作者清单。
  $ cut -d',' -f3 jan17no_headers.csv > authors.txt
  在这里,通过cut -d 相配合代表着我们需要第三列 (-f3) ,并将结果发送至名为 authors.txt 的新文件。
   八、uniq
  作者清单已经完成,但我们要如何知悉其中包含多少位不同的作者? 每位作者又各自编写了多少篇文章 ? 这里使用 uniq 。下面我们对文件进行 sort 排序,找到惟一值,而后计算每位作者的文章数量,并用结果替换原本内容。
  sort authors.txt | uniq -c > authors.txt
  现在已经可以看到每位作者的对应文章数,下面检查最后三行以确保结果正确。
  $ tail -n3 authors-sorted.txt 1 Tracy Miranda 1 Veer Muchandi 3 VM (Vicky) Brasseur
   九、awk
  最后让我们了解最后一款工具,awk awk 是一款出色的替换性工具,当然其功能远不止如此。下面我们重新回归 1 12 日文章列表 TSV 文件,利用 awk 创建新列表以标明各篇文章的作者以及各作者编写的具体字数。
  $ awk -F "\t" '{print $3 " " $NF}' jan20only.tsv
  Kushal Das 690
  D Ruth Bavousett 218
  Jason Baker 214
  Tracy Miranda 1007
  其中的-F "\t" 用于告知 awk 目前处理的是由 tab 分隔的数据。在大括号内,我们为 awk 提供执行代码。 $3 代表要求其将输出第三行,而 $NF 则代表输出最后一行 ( 字段数 的缩写 ) ,并在两项结果间添加两个空格以进行明确划分。
  虽然这里列举的例子规模较小,看似不必使用上述工具解决,但如果将范围扩大到包含93000 行的文件,那么其显然很难利用电子表格程序进行处理。
  利用这些简单的工具与小型脚本,大家可以避免使用数据库工具并轻松完成大量数据统计工作。无论您是专业人士还是业余爱好者,其作用都不容忽视。
来源:iyunv