用命令行去發(fā)掘有趣的“前十”
如果你喜歡做‘排名前10’之類的列表但又有點(diǎn)不好意思這樣說(shuō),那么告訴人們你熱愛(ài)數(shù)據(jù)的探索。為了進(jìn)一步打動(dòng)他們,向他們解釋你在命令行間的數(shù)據(jù)探索。但是不要告訴他們這其實(shí)很容易,以免你的好形象就這樣被毀滅了哦!
在這篇文章中,我將基于GNU/Linux工具和'單列表格'(也就是我所說(shuō)的簡(jiǎn)單列表)來(lái)做一些數(shù)據(jù)探索。如若想在這里通過(guò)命令行查看更多的信息,請(qǐng)查看'man'頁(yè),或者在“注釋”部分求解。
密碼
在***個(gè)列表里探討的是馬克.伯內(nèi)特2011著的關(guān)于10000 個(gè)最常用的密碼匯編。這個(gè)列表是有序的、使用最頻繁的,也是廣為人知的階乘“密碼”的最常用來(lái)源之一,與“123456”并列排名第二。在這里,我把該列表放到一個(gè)名為“passwords”的文件中,并且使用head命令把排名前10的列出來(lái)了:
(伯內(nèi)特解釋他是如何收集這些密碼的這里。你會(huì)注意到在列表中他把所有大寫字母都轉(zhuǎn)換成小寫的。)
OK,所以'password'是伯內(nèi)特列表的頂部。那么每個(gè)數(shù)字呢?
非常有趣的是!數(shù)字'1'出現(xiàn)在密碼列表中的次數(shù)多于第二個(gè)最常用數(shù)字'2'的兩倍,而且,除了0和9之外,這十個(gè)數(shù)字出現(xiàn)的次數(shù)以其數(shù)字順序排列。而排名前10的字母呢?
在 passwords 文件中出現(xiàn)最頻繁的字母依次是EARONISTLC,類似于EAIRTONSLC,這是至少一個(gè)出版的表格中提到的常用英文單詞中出現(xiàn)的字頻。這是否意味著,大部分密碼其實(shí)是一些常見(jiàn)的英語(yǔ)單詞呢,也許會(huì)參雜一些數(shù)字呢?
為了找到答案,我先把密碼轉(zhuǎn)換成一個(gè)純字母的字符串列表,然后看看有多少字符串是可以在英語(yǔ)詞典中找到的。
首先我將通過(guò) sed 命令刪除所有密碼中的數(shù)字,然后刪除所有的標(biāo)點(diǎn)符號(hào),再刪除所有的空行。這將創(chuàng)建出一個(gè)純字母的密碼列表。然后我通過(guò)sort 和 uniq來(lái)修剪列表的排序,將重復(fù)項(xiàng)取出。(例如,'abc1234def'和'abc1!2!3!def!'都剔除剩下'abcdef'.) 。根據(jù)wc命令,我把1000個(gè)密碼減至成8583個(gè)純字母的字符串:
我經(jīng)常使用一本便攜式的英語(yǔ)字典,我通常會(huì)使用usr/share/dict/american-english,這個(gè)文件是來(lái)自Debian Linux的一個(gè)發(fā)行版本。它包含了99171個(gè)單詞。我會(huì)先通過(guò)tr命令將這個(gè)詞表轉(zhuǎn)換為純小寫的,然后使用sort 和 uniq刪除掉任何重復(fù)的條目排序(例如'A' 和 'a' 都將成為 'a')。這樣就將詞表的數(shù)量減至97723項(xiàng)了:
我現(xiàn)在可以用comm命令及'-23'的參數(shù)來(lái)比較兩個(gè)列表,并報(bào)告純字母文件中而沒(méi)有出現(xiàn)在字典中的單詞:
總數(shù)是3137,所以至少有8583 -3137 = 5446個(gè)'核心'密碼在伯納特的純小寫字母列表中(大約63%)是簡(jiǎn)單的英語(yǔ)單詞,或者是簡(jiǎn)單的單詞附加一些數(shù)字或者標(biāo)點(diǎn)符號(hào)。我之所以說(shuō)“至少”,是因?yàn)樵?137個(gè)字符串中有很大比例是只有經(jīng)過(guò)輕微修改的純英語(yǔ)單詞、名稱、或者在/usr/share字典中未能找到的名稱修改而成的。在LA項(xiàng)中,例如,'labtec', 'ladyboy', 'lakeside', 'lalakers', 'lalala', 'laserjet', 'lasvegas', 'lavalamp' 和 'lawman'.
地名
在之前的一篇Linux Rain article,我描述了如何建立一張37萬(wàn)項(xiàng)澳大利亞的地名表。有了它,我現(xiàn)在可以回答一些類似這樣的關(guān)鍵問(wèn)題“Round Hill是澳大利亞山脈中***的名字嗎?”和“桑迪是沙灘之最,而巖溪峽谷呢?”
在地名表中地名字段的排名第2,所以這里有:
哇。我當(dāng)時(shí)甚至沒(méi)有關(guān)閉這個(gè)終端。(但是請(qǐng)注意到我是如何通過(guò)^string1^string2命令保存打印的內(nèi)容。它重復(fù)著***一個(gè)命令,但是用第2個(gè)字符串代替了第1個(gè)字符串。這是多么有用的BASH絕招?。?/p>
另一個(gè)亟待解決的問(wèn)題是有多少地名有'Mile'在其中,例如'Six Mile Creek',而他們的排名又是如何:
我在我的澳洲之旅發(fā)現(xiàn)有很多Dead Horse Creeks,因此有這些地名:
種類
第三個(gè)列表是探索我今年出版的1961-2010年期間澳大利亞新種類昆蟲名。從這個(gè)列表中,我去掉所有“物種的綽號(hào)”,就是種群組合的第二部分,比如像智人(你和我)和西方蜜蜂(歐洲蜜蜂)。
(科技小貼士:這個(gè)昆蟲表,可以從開(kāi)發(fā)數(shù)據(jù)Zenodo庫(kù)中https://zenodo.org/record/10481取得,包括亞種。在我的‘top 10’練習(xí)中,我首先分離出所有獨(dú)特的種群組合,這樣避免了重復(fù)的,例如蜜蜂iberica的亞種,以避免蜜蜂的綽號(hào)intermissa,等等。***一個(gè)物種文件有18155個(gè)綽號(hào)。)
大多數(shù)人講科學(xué)名稱帶玩笑式地用'-us'結(jié)局,如'Biggus buggus'。那么昆蟲學(xué)家呢?有幾個(gè)不錯(cuò)的,用命令行的方式獲取字符串的***2個(gè)字母,在這里我都會(huì)用到這2個(gè):
耶!昆蟲學(xué)家喜歡也‘-us’結(jié)尾。接下來(lái),我不知道有多少物種是以我的家鄉(xiāng)Tasmania州來(lái)命名的?(下面我想看看前100行,來(lái)確保我得到的所有'tasman'組合.)
那么昆士蘭呢?
一般來(lái)說(shuō),昆蟲物種名單中的前10名分別是什么呢?
嗯,除了明顯的'australis'和'australiensis',而地理方面的'occidentalis'(西部),另外昆蟲學(xué)家創(chuàng)建7個(gè)在10個(gè)***列表中的綽號(hào)已經(jīng)履行了其它昆蟲學(xué)家的意愿。(綽號(hào)'commoni'是給澳大利亞蝴蝶和蛾專家Ian F.B. Common[1917-2006]的榮譽(yù)。)
演變
上面的這些命令用在簡(jiǎn)單列表上。要從簡(jiǎn)單的列表變成文本塊,那就再次需要我們的命令行朋友了。例如,我把澳大利亞參議院于2014年7月16日的演講保存成文本文件hansard。將hansard分割成一個(gè)單詞列表:
現(xiàn)在看看講話中的單詞使用頻率:
即將推出...
從多列的表中做'top 10'等排名,需要更多些的命令行工具。我將會(huì)在未來(lái)的文章中證明他們的用處。