用命令列去發掘有趣的“前十”

Bob Mesibov發表於2014-09-07

如果你喜歡做‘排名前10’之類的列表但又有點不好意思這樣說,那麼告訴人們你熱愛資料的探索。為了進一步打動他們,向他們解釋你在命令列間的資料探索。但是不要告訴他們這其實很容易,以免你的好形象就這樣被毀滅了哦!

在這篇文章中,我將基於GNU/Linux工具和'單列表格'(也就是我所說的簡單列表)來做一些資料探索。如若想在這裡通過命令列檢視更多的資訊,請檢視'man'頁,或者在“註釋”部分求解。

密碼

在第一個列表裡探討的是馬克.伯內特2011著的關於10000 個最常用的密碼彙編。這個列表是有序的、使用最頻繁的,也是廣為人知的階乘“密碼”的最常用來源之一,與“123456”並列排名第二。在這裡,我把該列表放到一個名為“passwords”的檔案中,並且使用head命令把排名前10的列出來了:

(伯內特解釋他是如何收集這些密碼的這裡。你會注意到在列表中他把所有大寫字母都轉換成小寫的。)

OK,所以'password'是伯內特列表的頂部。那麼每個數字呢?

非常有趣的是!數字'1'出現在密碼列表中的次數多於第二個最常用數字'2'的兩倍,而且,除了0和9之外,這十個數字出現的次數以其數字順序排列。而排名前10的字母呢?

在 passwords 檔案中出現最頻繁的字母依次是EARONISTLC,類似於EAIRTONSLC,這是至少一個出版的表格中提到的常用英文單詞中出現的字頻。這是否意味著,大部分密碼其實是一些常見的英語單詞呢,也許會參雜一些數字呢?

為了找到答案,我先把密碼轉換成一個純字母的字串列表,然後看看有多少字串是可以在英語詞典中找到的。

首先我將通過 sed 命令刪除所有密碼中的數字,然後刪除所有的標點符號,再刪除所有的空行。這將建立出一個純字母的密碼列表。然後我通過sortuniq來修剪列表的排序,將重複項取出。(例如,'abc1234def'和'abc1!2!3!def!'都剔除剩下'abcdef'.) 。根據wc命令,我把1000個密碼減至成8583個純字母的字串:

我經常使用一本行動式的英語字典,我通常會使用usr/share/dict/american-english,這個檔案是來自Debian Linux的一個發行版本。它包含了99171個單詞。我會先通過tr命令將這個詞表轉換為純小寫的,然後使用sortuniq刪除掉任何重複的條目排序(例如'A' 和 'a' 都將成為 'a')。這樣就將詞表的數量減至97723項了:

我現在可以用comm命令及'-23'的引數來比較兩個列表,並報告純字母檔案中而沒有出現在字典中的單詞:

總數是3137,所以至少有8583 -3137 = 5446個'核心'密碼在伯納特的純小寫字母列表中(大約63%)是簡單的英語單詞,或者是簡單的單詞附加一些數字或者標點符號。我之所以說“至少”,是因為在3137個字串中有很大比例是隻有經過輕微修改的純英語單詞、名稱、或者在/usr/share字典中未能找到的名稱修改而成的。在LA項中,例如,'labtec', 'ladyboy', 'lakeside', 'lalakers', 'lalala', 'laserjet', 'lasvegas', 'lavalamp' 和 'lawman'.

地名

在之前的一篇Linux Rain article,我描述瞭如何建立一張37萬項澳大利亞的地名錶。有了它,我現在可以回答一些類似這樣的關鍵問題“Round Hill是澳大利亞山脈中最流行的名字嗎?”和“桑迪是沙灘之最,而巖溪峽谷呢?”

在地名錶中地名欄位的排名第2,所以這裡有:

哇。我當時甚至沒有關閉這個終端。(但是請注意到我是如何通過^string1^string2命令儲存列印的內容。它重複著最後一個命令,但是用第2個字串代替了第1個字串。這是多麼有用的BASH絕招!)

另一個亟待解決的問題是有多少地名有'Mile'在其中,例如'Six Mile Creek',而他們的排名又是如何:

我在我的澳洲之旅發現有很多Dead Horse Creeks,因此有這些地名:

種類

第三個列表是探索我今年出版的1961-2010年期間澳大利亞新種類昆蟲名。從這個列表中,我去掉所有“物種的綽號”,就是種群組合的第二部分,比如像智人(你和我)和西方蜜蜂(歐洲蜜蜂)。

(科技小貼士:這個昆蟲表,可以從開發資料Zenodo庫中https://zenodo.org/record/10481取得,包括亞種。在我的‘top 10’練習中,我首先分離出所有獨特的種群組合,這樣避免了重複的,例如蜜蜂iberica的亞種,以避免蜜蜂的綽號intermissa,等等。最後一個物種檔案有18155個綽號。)

大多數人講科學名稱帶玩笑式地用'-us'結局,如'Biggus buggus'。那麼昆蟲學家呢?有幾個不錯的,用命令列的方式獲取字串的最後2個字母,在這裡我都會用到這2個:

耶!昆蟲學家喜歡也‘-us’結尾。接下來,我不知道有多少物種是以我的家鄉Tasmania州來命名的?(下面我想看看前100行,來確保我得到的所有'tasman'組合.)

那麼昆士蘭呢?

一般來說,昆蟲物種名單中的前10名分別是什麼呢?

嗯,除了明顯的'australis'和'australiensis',而地理方面的'occidentalis'(西部),另外昆蟲學家建立7個在10個最流行列表中的綽號已經履行了其它昆蟲學家的意願。(綽號'commoni'是給澳大利亞蝴蝶和蛾專家Ian F.B. Common[1917-2006]的榮譽。)

演變

上面的這些命令用在簡單列表上。要從簡單的列表變成文字塊,那就再次需要我們的命令列朋友了。例如,我把澳大利亞參議院於2014年7月16日的演講儲存成文字檔案hansard。將hansard分割成一個單詞列表:

現在看看講話中的單詞使用頻率:

即將推出...

從多列的表中做'top 10'等排名,需要更多些的命令列工具。我將會在未來的文章中證明他們的用處。


via: http://thelinuxrain.com/articles/top-10-fun-on-the-command-line

原文作者:Bob Mesibov(Bob Mesibov 是塔斯馬尼亞人,已經退休,熱衷於 Linux tinkerer)

譯者:disylee 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章