用命令列去發掘有趣的“前十”
| 2014-09-07 21:15 收藏: 3 分享: 2
如果你喜歡做‘排名前10’之類的列表但又有點不好意思這樣說,那麼告訴人們你熱愛資料的探索。為了進一步打動他們,向他們解釋你在命令列間的資料探索。但是不要告訴他們這其實很容易,以免你的好形象就這樣被毀滅了哦!
在這篇文章中,我將基於GNU/Linux工具和'單列表格'(也就是我所說的簡單列表)來做一些資料探索。如若想在這裡透過命令列檢視更多的資訊,請檢視'man'頁,或者在“註釋”部分求解。
密碼
在第一個列表裡探討的是馬克.伯內特2011著的關於10000 個最常用的密碼彙編。這個列表是有序的、使用最頻繁的,也是廣為人知的階乘“密碼”的最常用來源之一,與“123456”並列排名第二。在這裡,我把該列表放到一個名為“passwords”的檔案中,並且使用head命令把排名前10的列出來了:
(伯內特解釋他是如何收集這些密碼的這裡。你會注意到在列表中他把所有大寫字母都轉換成小寫的。)
OK,所以'password'是伯內特列表的頂部。那麼每個數字呢?
非常有趣的是!數字'1'出現在密碼列表中的次數多於第二個最常用數字'2'的兩倍,而且,除了0和9之外,這十個數字出現的次數以其數字順序排列。而排名前10的字母呢?
在 passwords 檔案中出現最頻繁的字母依次是EARONISTLC,類似於EAIRTONSLC,這是至少一個出版的表格中提到的常用英文單詞中出現的字頻。這是否意味著,大部分密碼其實是一些常見的英語單詞呢,也許會參雜一些數字呢?
為了找到答案,我先把密碼轉換成一個純字母的字串列表,然後看看有多少字串是可以在英語詞典中找到的。
首先我將透過 sed 命令刪除所有密碼中的數字,然後刪除所有的標點符號,再刪除所有的空行。這將建立出一個純字母的密碼列表。然後我透過sort 和 uniq來修剪列表的排序,將重複項取出。(例如,'abc1234def'和'abc1!2!3!def!'都剔除剩下'abcdef'.) 。根據wc命令,我把1000個密碼減至成8583個純字母的字串:
我經常使用一本行動式的英語字典,我通常會使用usr/share/dict/american-english,這個檔案是來自Debian Linux的一個發行版本。它包含了99171個單詞。我會先透過tr命令將這個詞表轉換為純小寫的,然後使用sort 和 uniq刪除掉任何重複的條目排序(例如'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)
相關文章
- 5個經典有趣的 Linux 命令列技巧Linux命令列
- 短小精悍之 Redis 命令列工具有趣的罕見用法Redis命令列
- 簡單,好玩,有趣的命令列版12306(golang)命令列Golang
- 你值得了解的 10 個有趣的 Linux 命令列小技巧Linux命令列
- 終端中的樂趣:6個有趣的Linux命令列工具Linux命令列
- 用 Plumbum 開發 Python 命令列工具Python命令列
- 有趣常用的linux命令Linux
- Odin —— 用於構建命令列應用的 Go 開發包命令列Go
- Linux命令列:cURL的十種常見用法Linux命令列
- 在命令列開發 Android 應用程式命令列Android
- 開發 Linux 命令列實用程式(轉)Linux命令列
- 從0開始用python寫一個命令列小遊戲(十)Python命令列遊戲
- 6個有趣的Linux命令Linux
- 10條有趣的Linux命令Linux
- 有趣的linux命令總結Linux
- 有趣的命令列工具-一行命令搜尋、下載圖片並設定成桌布命令列
- node命令列開發命令列
- linux下有趣的幾個命令Linux
- 實用的Linux命令列技巧Linux命令列
- Linux 命令列生成隨機密碼的十種方法Linux命令列隨機密碼
- 用 nodejs 寫一個命令列工具 :建立 react 元件的命令列工具NodeJS命令列React元件
- java 去前導0Java
- JS陣列去重 – JSON陣列去重陣列JSON
- 10 條真心有趣的 Linux 命令Linux
- 酷炫:6個有趣的Linux命令Linux
- 編寫友好的命令列應用程式命令列
- 陣列去重的方法陣列
- 十個你可能沒用過的Linux命令Linux
- 有趣的觸發器事件觸發器事件
- 這些既有趣又實用的 Linux 運維命令,快快收藏!Linux運維
- iWant:一個去中心化的點對點共享檔案的命令列工具中心化命令列
- Linux 下十大命令列下載工具Linux命令列
- ffmpeg 命令列實用總結命令列
- 用Weex命令列快速建立工程命令列
- 用 Swift 來寫命令列程式Swift命令列
- 陣列去重陣列
- 那些有趣/用的 Python 庫Python
- 介紹一些有趣的MySQL pager命令MySql