@[toc]本文將爲讀者提供許多不同 Linux 命令的簡要概述。 將特別強調解釋如何在執行數據科學任務的上下文中使用每個命令。 我們的目標是讓讀者相信這些命令中的每一個都非常有用,並且讓他們了解每個命令在操作或分析數據時可以扮演什麽角色。
管道符號 “ | ”
許多讀者可能已經熟悉了“ | ”符號,但是如果不熟悉的話,值得提前指出: 下面幾節中討論的命令的所有輸入和輸出都可以使用“ | ”符號自動“管道”輸入到彼此中! 這意味著每個命令完成的所有特殊任務都可以鏈接在一起,從而生成非常強大和簡短的迷你程序,所有這些都直接在命令行上完成!
grep
什麽是 grep? “ grep”是一個可用于從文件中提取匹配文本的工具。 您可以指定許多不同的控件標志和選項,這些標志和選項允許您非常有選擇性地確定希望從文件或流中提取哪些文本子集。 Grep 通常用作“面向行”的工具,這意味著在找到匹配的文本時,Grep 將打印該行上的所有文本,盡管您可以使用“-o”標志只打印匹配的行部分。
爲什麽 grep 是有用的? “ grep”很有用,因爲它是在大量文件中搜索特定文本塊的最快方法。 一些很好的用例有: 從巨大的 web 服務器日志中過濾訪問特定的 web 頁面; 爲特定關鍵字的實例搜索代碼庫(這比使用 Eclipse Editor 的搜索要快得多,也更可靠) ; 在 Unix 管道中過濾另一個命令的輸出。
Grep 與數據科學有什麽關系? Grep 對于特定的數據科學任務非常有用,因爲它允許您非常快速地從數據集中篩選出所需的信息。 很可能您的源數據中包含大量與您試圖回答的問題無關的信息。 如果數據存儲在文本文件中的單個行中,則可以使用 grep 只提取要處理的行,如果您能夠想到一個非常精確的搜索規則來過濾它們的話。 例如,如果你有下面的。 Csv 文件,每一行都有銷售記錄:
item, modelnumber, price, tax
Sneakers, MN009, 49.99, 1.11
Sneakers, MTG09, 139.99, 4.11
Shirt, MN089, 8.99, 1.44
Pants, N09, 39.99, 1.11
Sneakers, KN09, 49.99, 1.11
Shoes, BN009, 449.22, 4.31
Sneakers, dN099, 9.99, 1.22
Bananas, GG009, 4.99, 1.11
你可以使用這樣的命令:
grep Sneakers sales.csv
只過濾掉包含文字“運動鞋”的銷售記錄。 下面是運行這個命令的結果:
Sneakers, MN009, 49.99, 1.11
Sneakers, MTG09, 139.99, 4.11
Sneakers, KN09, 49.99, 1.11
Sneakers, dN099, 9.99, 1.22
您還可以使用帶有 grep 的複雜正則表達式來搜索包含某些模式的文本。 例如,這個命令將使用 grep 過濾掉所有以“ BN”或“ MN”開頭,後面至少跟有3個數字的型號:
grep -o "\(BN\|MN\)\([0-9]\)\{3\}" sales.csv
下面是運行這個命令的結果:
MN009
MN089
BN009
sed
什麽是 sed? Sed 是一個用于執行搜索和替換操作的工具。 例如,你可以使用以下命令:
sed -i 's/dog/cat/g' *
將工作目錄中所有文件中的“ dog”替換爲“ cat”。
爲什麽 sed 有用? “ sed”非常有用,因爲您可以使用正則表達式執行複雜的匹配和替換。 正則表達式替換還支持回溯引用,允許您匹配任意模式,然後以某種方式只更改匹配文本的一部分。 例如,這個 sed 命令將在任何給定行上查找兩個帶引號的字符串,然後在不更改文本的任何其他部分的情況下交換它們的位置。 它還同時將引號變成括號:
echo 'The "quick brown" fox jumped over the "lazy red" dog.' | sed -E 's/"([^"]+)"([^"]+)"([^"]+)"/(\3)\2(\1)/'
結果如下:
The (lazy red) fox jumped over the (quck brown) dog.
Sed 與數據科學有什麽關系? Sed 在數據科學中最大的用例是,如果您想使用它,那麽您的數據可能不完全符合所需的格式。 例如,如果你的老板給你一個文本文件 data.txt,其中包含數千個錯誤地用雙引號括起來的數字:
age,value
"33","5943"
"32","543"
"34","93"
"39","5943"
"36","9943"
"38","8943"
可以通過以下 sed 命令運行該文件:
cat data.csv | sed 's/"//g'
取消所有任務,得到以下結果:
age,value
33,5943
32,543
34,93
39,5943
36,9943
38,8943
如果您需要將數字導入到另一個不能使用圍繞數字的引號的程序中,這將非常有用。 如果您曾經遇到過一些簡單的格式錯誤導致無法導入或正確處理數據集的問題,那麽很有可能有一個 sed 命令可以修複您的問題。
awk
什麽是 awk? Awk 是一個可以進行更高級搜索和替換可能需要通用計算的操作的工具。
爲什麽 awk 有用? Awk 很有用,因爲它基本上是一種通用編程語言,可以輕松處理格式化的行文本。 與 sed 可以做的事情有一些重疊,但 awk 要強大得多。 Awk 還可以用于需要記住不同行之間的狀態的更改。
Awk 與數據科學有什麽關系? 假設你有一個包含溫度值的 CSV 文件 temps.CSV,但是文件中沒有使用攝氏溫度或華氏溫度,而是混合了這兩種溫度,表示攝氏溫度的單位爲 c,華氏溫度的單位爲 f:
temp,unit
26.1,C
78.1,F
23.1,C
25.7,C
76.3,F
77.3,F
24.2,C
79.3,F
27.9,C
75.1,F
25.9,C
79.0,F
你可以用一個簡單的 awk 命令來完成這個任務:
cat temps.txt | awk -F',' '{if($2=="F")print (($1-32)*5/9)",C";else print $1","$2}'
結果將會是:
temp,unit
26.1,C
25.6111,C
23.1,C
25.7,C
24.6111,C
25.1667,C
24.2,C
26.2778,C
27.9,C
23.9444,C
25.9,C
26.1111,C
將所有溫度值標准化爲攝氏度。
sort
什麽是sort? sort的名字暴露了一切: 它是用來排序的!
爲什麽sort是有用的? 單獨進行排序並不是很有用,但是對于許多其他任務來說,這是一個重要的先決條件: 想要找到最大 / 最小的? 只要把它們分類,然後拿走第一個或最後一個。 想要前十名嗎? 把它們分類,然後拿走最後的10個。 需要數字排序還是字典排序? Sort 命令可以兩者兼顧! 讓我們用幾種不同的方式來排序以下隨機文本 foo.txt 文件:
0 1 1234 11 ZZZZ 1010 0123 hello world abc123 Hello World 9 zzzz
下面是一個執行默認排序的命令:
cat foo.txt | sort
結果就是:
0
0123
1
1010
11
1234
9
abc123
Hello World
hello world
ZZZZ
zzzz
請注意,上面的排序是字典序,而不是數字順序,所以數字可能不是您期望的順序。 我們可以用數字排序來代替使用’-n’標志:
cat foo.txt | sort -n
結果如下:
0
abc123
Hello World
hello world
ZZZZ
zzzz
1
9
11
0123
1010
1234
現在這些數字的順序是正確的。 另一個常見的要求是按照相反的順序排序,你可以使用’-r’標志:
cat foo.txt | sort -r
結果如下:
zzzz ZZZZ hello world Hello World abc123 9 1234 11 1010 1 0123 0
排序和數據科學有什麽關系? 本文中其他幾個與數據科學相關的 Linux 命令(comm、 uniq 等)要求您首先對輸入數據進行排序。 “排序”命令的另一個有用的標志是“-r”標志,它將隨機重新排列輸入的行。 這對于爲其他需要工作的軟件開發大量測試用例非常有用,不管文件中行的順序如何。
comm
什麽是comm? comm 是一個計算集合操作結果的工具: (聯合、交叉和補充)基于輸入文件中的文本行。
爲什麽comm是有用的? 如果您想了解兩個不同文件中常見或不同的行,Comm 非常有用。
comm與數據科學有什麽關系? 如果你有兩個電子郵件地址列表: 一個名爲 signups.txt 的文件,其中包含了注冊你郵件的人的電子郵件地址:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
以及另一個名爲 purchases.txt 的文件,其中包含購買你的産品的人的電子郵件地址:
[email protected]
[email protected]
[email protected]
[email protected]
對于這些文件,您可能想知道三個不同問題的答案: 1)哪些用戶注冊並購買了産品? 2)哪些用戶注冊了時事通訊,但沒有轉換爲購買? 3)哪些用戶進行了購買但沒有注冊訂閱時事通訊? 使用 comm 命令,您可以輕松地回答所有這三個問題。 這裏有一個命令,我們可以用來找到那些注冊了時事通訊並且購買了它的用戶:
comm -12 signups.txt purchases.txt
結果如下:
[email protected]
[email protected]
以下是我們如何找到那些注冊了時事通訊但沒有轉化的用戶:
comm -23 signups.txt purchases.txt
結果如下:
[email protected]
[email protected]
[email protected]
最後,這裏有一個指令,顯示了那些沒有對著時事通訊唱歌就購買商品的人:
comm -13 signups.txt purchases.txt
結果如下:
[email protected]
[email protected]
Comm 命令要求傳遞給它的任何輸入首先進行排序。 通常,你的輸入文件不會被預先排序,但是你可以在 bash 中使用以下語法直接使用 sort 命令將輸入傳遞給 comm,而不需要創建任何額外的文件:
comm -12 <(sort signups.txt) <(sort purchases.txt)
uniq
什麽是 uniq? “ uniq”命令幫助您回答有關唯一性的問題。
爲什麽 uniq 有用? 如果您想要去除重複的行並且只輸出唯一的行,uniq 可以做到這一點。 想知道每個項目被複制了多少次? 優衣庫會告訴你的。 希望僅 輸出重複的項目(例如,對應該是唯一的健全檢查輸入) ? 你也可以這麽做。
Uniq 與數據科學有什麽關系? 假設你有一個名爲‘ sales.csv’的充滿銷售數據的文件:
Shoes,19.00
Shoes,28.00
Pants,77.00
Socks,12.00
Shirt,22.00
Socks,12.00
Socks,12.00
Boots,82.00
你需要一份數據集中所有獨特産品的簡明列表。 你只需要使用 awk 獲取産品並將結果導入 sort,然後使用 uniq:
cat sales.csv | awk -F',' '{print $1}' | sort | uniq
結果如下:
Boots
Pants
Shirt
Shoes
Socks
接下來你可能想知道的是每件獨一無二的商品賣出了多少:
cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c
結果如下:
1 Boots
1 Pants
1 Shirt
2 Shoes
3 Socks
您還可以使用帶 uniq 的’-d’標志來獲取多次出現的項目列表。 這在處理幾乎是唯一的列表時非常有用。
tr
什麽是 tr? Tr 命令是一個可以移除或替換單個字符或字符集的工具。
爲什麽 tr 有用? 我發現使用 tr 命令最常見的原因是刪除 Windows 機器上創建的文件中不需要的回車字符。 下面的例子說明了這一點,並將結果導入到 xxd 中,這樣我們就可以檢查十六進制:
echo -en "Hello\r" | tr -d "\r" | xxd
您還可以使用‘ tr’命令進行其他特殊情況下的更正,這些更正可能需要在其他一些 unix 管道中應用。 例如,有時可能會遇到使用空字符分隔代替換行的二進制數據。 可以使用以下 tr 命令用換行代碼替換文件中的所有空字符:
echo -en "\0" | tr \\0 \\n | xxd
請注意,上面命令中的雙精度’’字符是必需的,因爲 tr 期望“0”表示 null 字符,但是‘’本身需要在 shell 上進行轉義。 上面的命令顯示了輸入到 xxd 中的結果,這樣您就可以驗證結果了。 在實際的用例中,您可能不希望在這個管道的末尾使用 xxd。
Tr 與數據科學有什麽關系? Tr 命令與數據科學的關系並不像這裏列出的其他命令那樣深刻,但它通常是特殊情況下必不可少的補充,在處理數據的另一個階段可能需要進行修複和清理。
cat
什麽是cat? Cat 命令是一個工具,您可以使用它將文件連接在一起並將其打印到 stdout。
爲什麽cat有用? 當您需要將多個文件縫合在一起,或者需要將文件輸出到 stdout 時,cat 命令非常有用。
cat與數據科學有什麽關系? 在執行數據科學任務時,“ cat”命令的“ concating”特性確實會出現很多問題。 一個常見的情況是,遇到多個 csv 文件,其中包含要聚合的格式類似的內容。 假設你有3個。 Csv 文件的電子郵件地址從時事通訊注冊,購買,和購買列表。 您可能需要計算所有用戶數據的潛在影響範圍,因此需要計算所有3個文件中的獨立電子郵件數量。 你可以使用 cat 把它們一起打印出來,然後使用 sort 和 uniq 打印出一組獨特的電子郵件:
cat signups.csv purchases.csv purchased.csv | awk -F'\t' '{print $1}' | sort | uniq
很可能你已經習慣看到人們使用 cat 來讀取文件並將其導入到其他程序中:
cat file.txt | somecommand
你也會偶爾看到人們指出這是 cat 的一個無用的用法,不是必須的,因爲你可以用這個語法來代替:
somecommand < file.txt
head
head是什麽? “ head”命令只允許您打印文件的前幾行(或字節)。
爲什麽head是有用的? 如果您希望查看一個巨大(許多 GiB)文件的一小部分,或者您希望計算分析的另一部分得到的“ top 3”結果,那麽這是非常有用的。
head如何與數據科學聯系起來? 假設您有一個文件“ sales.csv” ,其中包含您所銷售産品的銷售數據列表:
Shoes,19.00
Shoes,19.00
Pants,77.00
Pants,77.00
Shoes,19.00
Shoes,28.00
Pants,77.00
Boots,22.00
Socks,12.00
Socks,12.00
Socks,12.00
Shirt,22.00
Socks,12.00
Boots,82.00
Boots,82.00
你可能想知道下面這個問題的答案: “從最受歡迎到最不受歡迎的前三名産品是什麽? ” . 你可以用下面的管道來回答這個問題:
cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n -r | head -n 3
上面的 shell 管道將銷售數據輸入到 awk 中,並且只打印每行的第一列。 然後我們對産品名稱進行排序(因爲“ uniq”程序要求我們對數據進行排序) ,然後使用“ uniq”來獲得唯一産品的計數。 爲了對産品計數列表從最大到最小進行排序,我們使用‘ sort-n-r’對産品計數進行數值排序。 然後,我們可以通過管道將完整的列表輸入到 head-n 3中,只能看到列表中的前三項:
4 Socks
4 Shoes
3 Pants
tail
什麽是tail? ‘ tail’命令是‘ head’命令的一個附屬命令,因此您可以預期它的工作方式與‘ head’命令類似,只是它打印文件的結尾而不是開始。
爲什麽tail是有用的? ‘ tail’命令對于‘ head’命令有用的所有任務都很有用。
tail和數據科學有什麽關系? 下面是一個例子,說明如何使用下面的命令來計算上一節中銷售數據的底部3個産品:
cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n -r | tail -n 3
結果就是:
3 Pants
3 Boots
1 Shirt
請注意,這可能不是您想要的演示格式,因爲最低計數位于底部。 要查看輸出頂部的最低計數,你可以使用‘ head’命令,而不需要倒序排序:
cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n | head -n 3
結果就是:
1 Shirt
3 Boots
3 Pants
Tail 命令的另一個很好的用例是刪除文件的第一行。 例如,如果你有這樣的 CSV 數據:
product,price
Shoes,19.00
Shoes,28.00
Pants,77.00
Socks,12.00
Shirt,22.00
你試著用 awk 和 uniq 來計算不同的産品,如下所示:
cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c
你最終會得到如下輸出:
1 Pants
1 product
1 Shirt
2 Shoes
1 Socks
包含了頭部的“産品”這個詞,我們並不想要這個詞。 我們需要做的是修剪標題行,並開始只處理剩余行上的數據(在我們的例子中是第2行)。 我們可以使用‘ tail’命令,在輸出數據的行號(基于1的索引)前加上‘ + ’:
cat sales.csv | tail -n +2 | awk -F',' '{print $1}' | sort | uniq -c
現在我們得到了期望的結果與頭部省略:
1 Pants
1 Shirt
2 Shoes
1 Socks
wc
Wc 是什麽? Wc 命令是一個工具,您可以使用它來獲取單詞計數和行計數。
爲什麽 wc 有用? 當您想要快速回答“有多少行? ”這個問題時,這個命令非常有用 或者這是多少個字符 .
Wc 與數據科學有什麽關系? 很多情況下,很多快速問題可以改爲“這個文件有多少行? ” 想知道你的郵件列表中有多少封郵件嗎? 你可以使用這個命令:
wc -l emails.csv
並可能從結果中減去一(如果文件中包含 csv 頭)。
如果你在工作目錄文件夾中有多個文件,你想要計算所有文件的行數(包括總行數) ,你可以使用通配符:
wc -l *.csv
計算一段文本或一個文件中的字符數通常很有用。 您甚至可以將文本粘貼到 echo 語句中(使用-n 來避免換行符,因爲換行符會使計數增加1) :
echo -n "Here is some text that you'll get a character count for" | wc -c
結果就是:
55
find
什麽是find? “ find”命令可以使用許多不同的選項搜索文件,它還可以對每個文件執行命令。
爲什麽find是有用的? Find 命令對于搜索給定多個不同選項(文件 / 目錄類型、文件大小、文件權限等)的文件非常有用,但它最有用的特性之一來自“-exec”選項,該選項允許您在找到文件後對其執行命令。
find與數據科學有什麽關系? 首先,讓我們展示一個例子,說明如何使用 find 命令列出工作目錄文件夾中和下面的所有文件:
find .
正如您在上面的 wc 命令中看到的,您可以計算工作目錄文件中所有文件的行數。 然而,如果你想對所有的文件、目錄和子目錄進行叠代來得到每個文件的總行數(例如在你的代碼庫中進行總行數) ,你可以使用 find 來打印每個文件的文本,然後通過管道將每個文件的 聚合 輸出輸入到‘ wc’來得到行數:
find . -type f -exec cat {} \; | wc -l
當然,您可以通過更改‘ . ’來在除工作目錄目錄以外的其他特定目錄上運行類似于上面的命令 成爲你想要的目錄。 只是要小心運行‘-exec’的 find,特別是如果你是作爲 root 用戶運行的話! 如果不小心對“ / ”目錄運行了錯誤的命令,可能會造成很大的損害。
tsort
什麽是tsort? “ tsort”是一個可以用來執行拓撲排序的工具。
爲什麽它是有用的? “拓撲排序”是許多現實世界中的問題的解決方案,這些問題你可能每天都會遇到,卻沒有注意到。 一個非常著名的例子是提出一個時間表來完成一些任務,這些任務在上一個任務完成之前是不能開始的。 這樣的考慮是必要的在建築工程,因爲你不能完成的工作,油漆牆,直到幹牆已經安裝。 你不能安裝幹牆,直到電力工作已經完成,你不能完成電力工作,直到牆壁框架已經完成等。 如果你只是在建房子,你也許可以把這些都記在腦子裏,但是大型建築項目需要更多的自動化方法。 讓我們在 task dependencies.txt 文件中回顧一個使用構造任務來構建房屋的示例:
wall_framing foundation
foundation excavation
excavation construction_permits
dry_wall electrical
electrical wall_framing
wall_painting crack_filling
crack_filling dry_wall
在上面的文件中,每一行由兩個“單詞”組成。 當“ tsort”命令處理文件時,它將假定第一個單詞描述了需要在第二個單詞之後出現的內容。 在處理完所有行之後,“ tsort”將按照大多數下遊依賴項到最少的下遊依賴項的順序輸出所有單詞。 現在讓我們試一下:
cat task_dependencies.txt | tsort
結果如下:
wall_painting
crack_filling
dry_wall
electrical
wall_framing
foundation
excavation
construction_permits
您可能還記得上面的內容,您可以使用帶有“ sort”命令的“-r”標志來獲得文件中行的隨機排序。 如果我們在依賴項列表中重複“隨機”排序,並將其導入 tsort,你會發現結果總是相同的,盡管“ sort-r”的輸出每次都不同:
cat task_dependencies.txt | sort -R | tsort
這是因爲即使我們在這個文件中重新排列行,任務相互依賴的實際順序也不會改變。
這僅僅觸及了拓撲排序的一點皮毛,但是希望這能激起你足夠的興趣,讓你去查看維基百科關于拓撲排序的頁面
這和數據科學有什麽關系? 拓撲排序是一個基本的圖論問題,出現在很多地方: 機器學習; 物流; 調度; 項目管理等。
tee
Tee 是什麽? “ tee”命令是一個工具,它允許您將流信息分離到一個文件中,同時還可以將其打印到當前流的輸出中。
Tee 與數據科學的關系如何? “ tee”命令實際上不會爲您做任何分析工作,但是如果您試圖調試爲什麽複雜的 shell 管道無法工作,那麽它會非常有用。 讓我們以上面的一個例子爲例,在管道的每個階段之間放置對‘ tee’命令的引用:
cat sales.csv | tail -n +2 | tee after_tail.log | awk -F',' '{print $1}' | tee after_awk.log | sort | tee after_sort.log | uniq -c | tee after_uniq.log
現在,當您運行這個命令時,您將得到4個文件,它們都顯示了流程中每個階段的輸出是什麽樣的。 如果您希望能夠返回並檢查經曆過罕見或複雜錯誤的 shell 管道,那麽這可能非常方便。 複雜的正則表達式通常用在這樣的管道中,有時候可以匹配你不希望它們匹配的東西,所以使用這種方法你可以很容易地獲得更深入的了解每一個階段是怎麽回事。
「>」重定向符號
符號是一個輸出重定向符號,可用于重定向輸出。可用于重定向輸出文件,而不是將其打印到屏幕上。
cat sales.csv | tail -n +2 | awk -F',' '{print $1}' | sort | uniq -c > unique_counts.txt
「<」重定向符號
什麽是 < ? 符號是一個輸出重定向符號,它可以將文件的內容指向程序的輸入。 這是上面討論的無用貓問題的替代方案:
grep Pants < sales.txt
混淆 Unicode 結果
最終會遇到的一個常見問題與混合不同的 Unicode 編碼有關。 特別值得注意的是,許多企業軟件提供商在進行編碼時會選擇 UTF-16而不是 UTF-8。 Csv 文件或數據庫轉儲。
例如,假設您希望通過一組文件對單詞‘ Hello’的所有實例進行 grep 處理。 首先,您可以檢查文件包含的內容:
cat sometext.txt
你可以看到它包含了 Hello 這個文本:
Hello World!
這怎麽可能發生? 當你查看十六進制文件時,答案變得更加清晰了:
xxd sometext.txt
給出如下輸出:
00000000: fffe 4800 6500 6c00 6c00 6f00 2000 5700 ..H.e.l.l.o. .W.
00000010: 6f00 7200 6c00 6400 2100 0a00 o.r.l.d.!...
這裏發生的情況是,文件‘ somefile.txt’以 UTF-16編碼,但是您的終端(可能)默認設置爲使用 UTF-8。 將 UTF-16編碼的文本中的字符打印到 UTF-8編碼的終端並沒有顯示出明顯的問題,因爲 UTF-16空字符在終端上沒有得到表示,但是其他每個奇數字節只是一個看起來與 UTF-8編碼相同的常規 ASCII 字符。
正如您在上面的輸出中看到的,這個文件並沒有使用 UTF-8對文件進行編碼,而是使用 UTF-16le。 沒有找到文本‘ Hello’ ,因爲當您在命令行上爲‘ Hello’鍵入 grep 時,您鍵入的字符將在當前設置在終端環境(可能設置爲 UTF-8)的字符編碼文件中進行解釋。 因此,搜索字符串不包括這些 ASCII 字符後面額外的空字節,因此搜索失敗。 如果你想搜索 UTF-16字符,你可以使用這個 grep 搜索:
grep -aP "H\x00e\x00l\x00l\x00o\x00" * sometext.txt
要打開二進制文件搜索,‘ a’標志是必要的,因爲 UTF-16中的空字符會導致文件被 grep 解釋爲二進制文件。 ‘ p’標志指定 grep 模式應該被解釋爲一個 Perl 正則表達式,這將導致解釋‘ x’轉義。
iconv -f UTF-16 -t UTF-8 sometext.txt > sometext-utf-8.txt
現在你在處理這個文件時不需要采取任何特殊的步驟,因爲這個編碼現在很可能與你的終端當前的編碼兼容:
00000000: 4865 6c6c 6f20 576f 726c 6421 0a Hello World!.
直接從數據庫管道
如果你不能使用數據庫,你就算不上一個數據科學家。 幸運的是,大多數常見的數據庫應用程序都有一些直接從命令行運行即席查詢的機制。 請注意,這種做法非常粗糙,根本不推薦用于嚴肅的調查,而是用于獲得快速、低保真的結果。 讓我們從使用 Postgres SQL server 的示例開始。 假設您有一個名爲 url 的簡單數據庫表:
DROP TABLE urls;
CREATE TABLE urls (
id serial NOT NULL PRIMARY KEY,
url character varying(1000)
);
insert into urls (url) values ('http://example.com/');
insert into urls (url) values ('http://example.com/foo.html');
insert into urls (url) values ('http://example.org/index.html');
insert into urls (url) values ('http://google.ca/');
insert into urls (url) values ('http://google.ca/abc.html');
insert into urls (url) values ('https://google.ca/404.html');
insert into urls (url) values ('http://example.co.uk/');
insert into urls (url) values ('http://twitter.com/');
insert into urls (url) values ('http://blog.robertelder.org/');
您想要創建一個列表,顯示每個域名在這個表中的 url 中是多麽常見。 您可以通過創建一個命令來提取 url 數據(對于具有多列的類似查詢,可以使用逗號) :
psql -d mydatascience -t -A -F"," -c "select url from urls;"
産生這樣的輸出:
http://example.com/
http://example.com/foo.html
http://example.org/index.html
http://google.ca/
http://google.ca/abc.html
https://google.ca/404.html
http://example.co.uk/
http://twitter.com/
現在,我們可以在這個管道上添加一個簡單的正則表達式,只選擇域名:
psql -d mydatascience -t -A -F"," -c "select url from urls;" | sed -E "s/^https?:\/\/([^\/]+).*/\1/"
下面是我們正在研究的清單:
example.com
example.com
example.org
google.ca
google.ca
google.ca
example.co.uk
twitter.com
現在我們可以使用上面提到的 sort / uniq 技巧來得出最終的解決方案:
psql -d mydatascience -t -A -F"," -c "select url from urls;" | sed -E "s/^https?:\/\/([^\/]+).*/\1/" | sort | uniq -c | sort -n -r
Mysql 客戶端有一組類似的命令行選項,用于將數據提取到命令行:
mysql ... -s -r -N -e "select 1,2;"
當然,您可能認爲您最喜歡的查詢語言可以直接在 SQL 命令行上作爲單個查詢來完成這些操作,但是這裏的要點是表明,如果需要,您可以在命令行上完成這些操作。
總結
正如我們在本文中所討論的,有許多 Linux 命令對于快速解決數據科學問題非常有用。 本文只爲每個命令展示了幾個有用的標志,但實際上還有幾十個。 希望,你的興趣已經足夠激起進一步研究他們。
如果你感興趣可以關注公衆號「chasays」- 程序員彙聚地