私のディレクトリに40個のファイルがあり、各ファイルの最初の列に「2」を含む行数を個別に計算したいと思います。
私はこのようなことを試していますが、各ファイルの合計を印刷して個々の合計をしたいです。
find . -type f -print0 | xargs -0 awk '($1=="2"){++count} END {print count}'
明確にするために、次の例を挙げましょう。
ファイル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
ご協力ありがとうございます!
答え1
私は数字を数えるのを助けることができますgrep
。必要な行がで始まると仮定すると、2
次のようになります。
grep -c '^[[:space:]]*2\>' $(find . -type f -print0 | xargs -0 echo)
正規表現の終わりでは、\>
2ではなく20で始まる行などの誤った肯定を避けるために、一致が「単語の境界」で停止するようにします。
メモ:
探している「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
このスイッチは、シンボルを使用して数値修飾子を指定できる拡張正規表現を有効にするために必要です{}
(たとえば、「前のパターンと複数回一致」)。
ただし、ファイルに存在しない列番号を入力すると、正規表現は自動的に失敗します。
答え2
いくつかの回避策:
awk
次のオプションを使用して各ファイルを実行しますfind
-exec
。find . -type f \ -exec awk '($1=="2"){++count}END{print FILENAME ": " count}' {} \;
awk
FNR
変数を使用して awk スクリプトのファイル変更を検出します。find . -type f -print0 | xargs -0 \ awk 'FNR==1{if (NR!=1){print count} printf("%s: ", FILENAME);}($1=="2"){++count}END{print count}'
答え3
出力を変更しても問題ない場合は、次のことができます。
$ grep "^2" *|awk '{print $1}'|uniq -c
2 FILE_1:2
3 FILE_2:2
印刷したい場合:
$ grep "^2" *|awk '{print $1}'|uniq -c|sed 's/:2//'|awk '{print $2, $1}'
FILE_1 2
FILE_2 3