Bash

遞歸計算目錄中所有文件的列中具有特定值的行數

  • July 10, 2013

我在一個目錄中有 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開關來啟用擴展正則表達式,它允許您使用{}符號來指定數字量詞(即“多次匹配先前的模式”)。

但是請注意,如果您輸入文件中不存在的列號,則正則表達式將靜默失敗。

引用自:https://unix.stackexchange.com/questions/82544