Bash
遞歸計算目錄中所有文件的列中具有特定值的行數
我在一個目錄中有 40 個文件,我想分別計算每個文件的第一列中有一行“2”的次數。
我正在嘗試這樣的事情,但它會列印出每個文件的總和,我想要單獨的總和:
find . -type f -print0 | xargs -0 awk '($1=="2"){++count} END {print count}'
為了清楚起見,這是一個例子:
FILE_1
2 345 123 4 2 4567 2344 6 3 2345 657 87 6 234 345 6
文件_2
1 12 436 7 2 54 86 8 2 23 48 0 2 098 0 8 8 98 9 0
列印:
FILE_1 2 FILE_2 3
我實際得到的是:
列印:
5
謝謝你的幫助!
你可以
grep
為你數一數。假設您需要的行以 開頭2
,您可以使用以下內容:grep -c '^[[:space:]]*2\>' $(find . -type f -print0 | xargs -0 echo)
正
\>
則表達式末尾的 確保匹配將在“單詞邊界”處停止,以避免錯誤警報,例如以 20 而不是 2 開頭的行。筆記:
如果您要查找的“40 個文件”都在同一個目錄中(而不是在子目錄中),您可以
find
只搜尋目前目錄而無需遞歸(這樣可以減少延遲),如下所示:find -maxdepth 1 . -type f -print0
更新:
要將 2 出現在不同列中的文件與第一個匹配,您可以執行以下操作:
COLNUM=3 TOMATCH=$(($COLNUM-1)) grep -cE "^[[:space:]]*([0-9]+[[:space:]]+){$TOMATCH}2\>" \ $(find . -type f -print0 | xargs -0 echo)
您可以
COLNUM
根據需要進行更改。基本上,它的作用是嘗試匹配COLNUM-1
在單詞邊界處後跟 2 的列。需要該-E
開關來啟用擴展正則表達式,它允許您使用{}
符號來指定數字量詞(即“多次匹配先前的模式”)。但是請注意,如果您輸入文件中不存在的列號,則正則表達式將靜默失敗。