awkを使用して#で始まらない複数のファイルの行数を計算し、ファイル名でリストするにはどうすればよいですか?

awkを使用して#で始まらない複数のファイルの行数を計算し、ファイル名でリストするにはどうすればよいですか?

grep "^[^#]" file.txt | wc -l私はそれを単一のファイルの行数を計算するために使用しました。

awk次に始まらない行数をどのように計算#し、このようにファイル名を印刷できますか?

file1.txt 30 
file2.txt 33
....

答え1

次の方法でこれを行うこともできますgrep

grep -c "^[^#]" *

または

grep -cv "^#" *

前者は空行も除外します。後者はそうではありません。

現在のディレクトリに単一のファイルがある場合、ファイル名は表示されません。grep一部のバージョン(GNUを含む)では、次のオプションを追加することでこれを防ぐことができます。grep-H

grep -cvH "^#" *

GNUはgrepまた、次の降順ディレクトリツリーの再帰検索もサポートしています。

grep -rcvH "^#" .

出力が要件と一致しないため、次のように表示されます。

file1.txt:30
file2.txt:33

ただし、この問題は出力をパイピングすることで解決できますsed 's/:\([^:]*\)$/ \1/'

答え2

実行できるアクションは次のとおりですawk(awkにも同じことが^[^#]当てはまりますが、正規表現のマッチでスラッシュペア内に作成されます(他の方法もあります))。grepawk/.../

find . -type f -exec \
    awk '/^[^#]/ {count++}; END{ print FILENAME, count+0 }' {} \;

またはGNU awkがある場合ENDFILE{}目詰まり:

gawk '/^[^#]/{ count++ }; ENDFILE{ print FILENAME, count+0; count=0 }' ./multiple.files*

または再帰的に:

find . -type f -exec \
    gawk '/^[^#]/{ count++ }; ENDFILE{ print FILENAME, count+0; count=0 }' {} +
メモ:
  • を使用すると、/^[^#]/空行計算をスキップします。 _
  • を使用することは、入力に空白行がない場合にのみ条件付きと同じです!/^#/。それ以外の場合は空行も計算されます。これは実際に実行される操作であり、要求時により正確です。/^[^#]/!/^#/「#で始まらない行の計算」
  • !/^#/まったく同じです/^([^#]|$)/(したがって、両方とも空行も計算します)

上記を考慮して「# で始まらない行の計算」などの空行も計算するには、次のようにします.

awk '!/^#/{count++} END{ print FILENAME, count+0 }'

またはそれに対応するもの:

awk '/^([^#]|$)/{count++} END{ print FILENAME, count+0 }'

または(推奨@エドモートン):

awk '/^#/{ count++ } END{ print FILENAME, FNR-count }'

そして、GNU awk形式にも同じアプローチを適用します。

awk '/^#/{ count++ } ENDFILE{ print FILENAME, FNR-count; count=0 }'

ファイルがコメント行でいっぱいのときに印刷出力をスキップするには、次のようにします。

awk '/^#/{ count++ } END{ if(count) print FILENAME, FNR-count }'

答え3

for i in  *
do
if [[ -f "$i" ]]
then
co=$(grep -vc "^#"  "$i" )
echo "$i $co"
fi
done

答え4

そしてperl

find . -type f -exec perl -lnse '
  /^#/ || $c++;
  eof  && (print($ARGV,$c),$c=0);
' -- -,=: {} +

POSIXlyを使用してくださいawk

find . -type f -exec awk -v OFS=: '
FNR==1 && NR>1 {
  print prev, knt+0
  knt=0
}
substr($0,1,1) != "#"{knt++}
FILENAME != prev {prev=FILENAME}
END { print prev, knt+0 }
' {} +

関連情報