pipeline是Linux體系裡處理資料的核心觀念,其主要作用是把指令或是程式串起來建立一連串的資料處理流程,透過這種方式能用組裝的把單一的指令串起來組成一段具有不同功能的流程,如果足夠熟悉的話,很多資料清理都可以這些既有的指令快速搭建出我們想要的功能。
稍微複雜一點的作法是把一些pipeline和邏輯判斷組織起來,變成一隻shell script 腳本。而實務上很多輕量的資處理工作都是類似這樣簡單搭建的。pipeline的符號為「 | 」,會創造一個匿名管道Anonymous Pipes,通常會搭配輸入和輸出重定向的符號「 < 」以及「 > 」一起使用。
匿名管線符號「 | 」語意是會把左側指令或程式的標準輸出丟給右側作為標準輸入,舉例來說像是:
cat test.txt
會把 test.txt的內容讀到標準輸出上,如果我們希望計算這個檔案的行數,則可以搭配使用「 wc -l 」指令來完成。
wc是word count ,是Linux計算字數的內建指令,當然它本身也是一隻程式,通常位於/usr/bin/wc(想知道它的路徑可以下whereis wc來找出來),加上參數「 -l 」就能計算行數,未指定檔名的情況會從標準輸入。要把「cat」的標準輸出給「wc -l」作為輸入,則可以用pipeline的符號「 | 」搭起來變成:
cat test.txt | wc -l
雖然單純以wc自己寫成「wc -l test.txt」同樣可以完成任務,但一旦流程更複雜,我們就需要用這個方式來組合出所需的流程。
再舉個例子,像如果我們想要統計當前目錄下所有.txt檔出現”jo”的行數為何,就可以拆解成三個步驟:1.用「 cat 」把txt檔拼接起來,2.用「 grep 」把”jo”出現的行撈出來,3.用wc統計行數,這三步驟則是用「 | 」,搭起來變成:
cat *.txt | grep "jo" | wc -l
再簡潔一點可用grep的參數「-c 」計算數量
cat *.txt | grep "jo" -c
再更複雜一點的,從txt檔案中以空白切分,並統計詞頻後排序輸出成csv
cat *.txt | tr ' ' '\n' | sort | uniq -c |sort -r | awk -v OFS=, '{print $2,$1}' > output.csv
這裡的流程拆解如下:
首先用「cat」把當前目錄下的txt合併,用「tr」把空格換成換行,「sort」排序把相同的字母排一起,「uniq -c 」計算單詞數量,再用「sort -r 」按照大到小排序,到這一步其實已經差不多了,只剩下修改格式成csv,用「awk」改一下順序變成先單詞再數字,並且以逗號分隔,然後才用重定向輸出到檔案「 output.csv」。雖然看起來稍微複雜,但只要熟悉指令的組成,很多例行公事都能用類似的方式快速解決。像是唸一唸咒語,電腦就能幫忙包辦大小事。
類似這樣的作法很常出現在複雜度較低的資料處理系統上,有的會把簡單的需求用shell script以pipeline來搭建,而那些較為複雜的再用Python等程式語言撰寫。
本文允許重製、散布、傳輸以及修改,但不得為商業目的之使用
使用時必須註明出處自:楊明翰 , 台灣人工智慧與資料科學研究室 https://aistudio.tw