天天看點

Linux資料分析之九個給力的指令行工具

作者:IT小英雄
要對資料進行分析,大家會從哪裡入手?對于大多數熟悉了圖形工作環境的朋友來說,電子表格工具無疑是第一選項。但指令行工具同樣能夠更快更高效地解決問題——且隻須稍微學習即可上手。
Linux資料分析之九個給力的指令行工具

要對資料進行分析,大家會從哪裡入手?

對于大多數熟悉了圖形工作環境的朋友來說,電子表格工具無疑是第一選項。但指令行工具同樣能夠更快更高效地解決問題——且隻須稍微學習即可上手。

大部分此類工具凍嚴格局限于Linux,而多數可同樣運作在Unix甚至是Windows環境之下。在今天的文章中,我們将嘗試幾款簡單的開源資料分析工具,并共同了解其如何運作。

Linux資料分析之九個給力的指令行工具

一、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#39;/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#39;/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

作者清單已經完成,但我們要如何知悉其中包含多少位不同的作者?每位作者又各自編寫了多少篇文章?這裡使用unip。下面我們對檔案進行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行的檔案,那麼它顯然很難利用電子表格程式進行處理。

利用這些簡單的工具與小型腳本,大家可以避免使用資料庫工具并輕松完成大量資料統計工作。無論您是專業人士還是業餘愛好者,它的作用都不容忽視。

原文來自:http://os.51cto.com/art/201702/533060.htm

本文位址:https://www.linuxprobe.com/data-analysis-command.html編輯員:張雄,稽核員:馮振華

本文原創位址:https://www.linuxprobe.com/data-analysis-command.html

繼續閱讀