統計文字檔案中字元的出現次數
概述
我們將學習如何使用Linux命令來獲取輸入檔案中特定字元出現的次數。
我們假設您瞭解一些常見的Linux命令,包括grep、awk和tr。
我們還假設我們的輸入檔案tpoint.txt包含一些虛擬資料。
$ cat tpoint.txt "I Love Tpoint!!!" "Tpoint is great!!!"
在本教程的其餘部分,我們將使用tpoint.txt進行演示。
使用grep命令
grep命令用於在輸入檔案中查詢特定字串。
我們現在來看一下獲取檔案中字元數的命令:
$ grep -o 'e' tpoint.txt | wc -l 4
我們正在搜尋檔案tpoint.txt中字母“e”的出現次數。-o選項在不同的行中顯示匹配的部分。
現在我們使用“|”符號將grep程式的輸出連線到wc程式的輸入。wc命令中的-l選項告訴我們給定檔案中共有多少行。
不區分大小寫的搜尋
grep命令允許使用-i選項進行不區分大小寫的搜尋。
$ grep -o -i 'l' tpoint.txt | wc -l 3
使用多個輸入檔案
您可以使用grep命令同時檢查多個輸入。例如,如果您想知道文字檔案中每一行的長度,您可以執行以下命令:
$ cat > dummy.txt This is dummy text. $ grep -o -i 'e' tpoint.txt dummy.txt | wc -l 5
我們添加了一個名為dummy.txt的新檔案,並對重新命名為tpoint.text的檔案和dummy.txt進行了字元計數。
我們使用grep命令計算每個檔案中的字元數。結果包括兩個檔案中字元的總數。
使用tr命令
tr是一個用於執行基於字元的轉換的工具。
我們可以組合-c和-d兩個選項來獲取字元數:
$ tr -c -d 'l' < tpoint.txt | wc -c 2
讓我們首先了解上述命令中使用的選項。
−c − 此選項將取集合的補集
−d − 它將刪除集合中提到的所有字元
字串定義為一系列字元。在我們的示例中,字串只是一個字母l。
當我們將-c和-d選項組合在一起時,它將刪除除-d選項指定的字元之外的所有內容。
結果字串將使用管道符號(|)透過管道傳輸到wc命令。wc命令中的-c選項將返回字元的總數。
不區分大小寫的搜尋
您可以透過將大小寫字母都新增到集合中來執行不區分大小寫的搜尋。
$ tr -cd 'lL' < tpoint.txt | wc -c 3
使用awk命令
Awk是一個用於處理文字檔案的程式設計工具。它從輸入檔案讀取行,對每一行執行某些操作,然後將修改後的行寫回另一個檔案。
與我們目前為止討論的兩種方法不同,這種方法有點難以理解。
讓我們來看一下這個命令以及它是如何工作的。
$ awk -F 'e' '{s+=(NF-1)} END {print s}' tpoint.txt 4
awk命令列工具使用的預設字元是空格。但是在這裡,我們使用-F命令列引數用e替換了預設欄位分隔符。我們希望為每個“e”的例項將我們的資料分成兩列。
要獲取每行的字元數,我們需要將每一行的長度加起來,然後除以總行數。我們可以使用以下程式碼來實現這一點:我們將每個單詞的計數加起來,最後得到整個文件的字元出現總數。
效能比較
我們目前為止討論的所有三種方法都是透過執行相同的基本任務來執行的。但是,它們之間的區別在於它們處理資料的方式。
對於小的字串或小檔案,這些命令的執行時間幾乎相同。但是,當檔案大小過大時,它們之間的真正區別就顯現出來了。
讓我們對一個1.1 GB的檔案執行所有這三個命令列,看看哪個命令花費的時間更少。
$ ls -lah large.txt -rw-r--r--. 1 root root 1.1G Jun 12 10:53 large.txt $ time grep -o 'e' large.txt | wc -l 82256735 real 0m40.733s user 0m39.649s sys 0m0.714s $ time tr -c -d 'e' < large.txt | wc -c 82256735 real 0m2.542s user 0m1.892s sys 0m0.433s $ time awk -Fe '{s+=(NF-1)} END {print s}' large.txt 82256735 real 0m11.080s user 0m9.589s sys 0m0.933s
對於大型檔案中的字元計數,tr命令是這三種命令中速度最快的。
結論
我們學習了查詢文字文件中字元數的不同方法。我們討論了一些特殊情況,例如不區分大小寫的搜尋和從多個輸入檔案中搜索。
我們發現tr命令比awk或grep命令執行速度更快。