私は多数のファイルやサブディレクトリから「the」のすべての発生を見つけて計算する小さなスクリプトを書いています。次に、ファイルアドレスと「the」の発生回数を印刷する必要があります。しかし、私はそれを達成する方法を知りません。
find . -name "*.txt" -type f -printf "%p\t" -exec grep -c "the" {}\;
ex.sh プログラム名
txt ファイル拡張子
単語発生の検索
正しい出力は次のようにする必要があります。
./ex.sh txt the ./etext00/00ws110.txt 42764 ./etext00/1cahe10.txt 26692 ./etext00/1vkip11.txt 21895 ./etext00/2cahe10.txt 24604 ./etext00/2yb4m10.txt 15476 ./etext00/8rbaa10.txt 3131
私が得るもの:
./etext00/00ws110.txt 35388 ./etext00/1cahe10.txt 17905 ./etext00/1vkip11.txt 14617 ./etext00/2cahe10.txt 16971 ./etext00/2yb4m10.txt 9938 ./etext00/8rbaa10.txt 1839
私はそれが「the」の外観を含む行の数であると仮定していますが、一部の行には「the」が1つ以上ある場合があります。
答え1
grep -o the
生成された行数を使用して計算します。
find . -name "*.txt" -type f -printf "%p\t" \
-exec sh -c 'grep -o "the" "$0" | wc -l' {} \;
grep -o
各行の各一致を別々の行に返します(出力行ごとに1つの一致)。
in(完全な単語の一致)など、一致を含める(大文字と小文字の区別)および除外するために-wi
withを使用することもできます。grep
The
the
theory
答え2
すでにGNU拡張()を使用しているので、-printf
GNUの場合はawk
次のことができます。
find . -name '*.txt' -size +2c -readable -type f -exec gawk -v RS=the '
ENDFILE {print FILENAME "\t" (FNR - ($0 != ""))}' {} +
つまり、レコード区切り文字として使用され、txt
各ファイルを処理した後にレコード数を報告します。ただし、最後の発生以降に表示される可能性がある(そして一般的に表示される)追加の履歴は計算しないでくださいtxt
。