ディレクトリ内のすべてのファイルに対して、列の特定の値を持つ行数を繰り返し計算します。

ディレクトリ内のすべてのファイルに対して、列の特定の値を持つ行数を繰り返し計算します。

私のディレクトリに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このスイッチは、シンボルを使用して数値修飾子を指定できる拡張正規表現を有効にするために必要です{}(たとえば、「前のパターンと複数回一致」)。

ただし、ファイルに存在しない列番号を入力すると、正規表現は自動的に失敗します。

おすすめ記事