web-dev-qa-db-ja.com

Grep:1行あたりの一致数を数える

.texファイルの各行の一致数(この場合は{または}の出現)を取得しようとしています。

-oフラグは一致のみを返すことを知っていますが、-nフラグと組み合わせた場合でも、新しい行に各一致を返します。これを繰り返して繰り返し数を数えることができるものは何も知りません。 -cフラグは、ファイル全体の一致の合計数のみを返します-一度に1行ずつgrepにパイプできますか?

27
Chris H
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

出力は次のようになります。

3 1
1 2

1行目に3回、2行目に1回出現することを意味します。

https://stackoverflow.com/a/15366097/3378354 から取得。

30
Moebius

さまざまな解決策を読んだ後、これが問題への最も簡単なアプローチだと思います。

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt
3
alfredocambera

grepの使用は必須ですか?代替案は次のとおりです。

 sed 's/[^ {}] // g' your_file | awk '{print NR、length}' 

sedは、{}以外のすべての文字を削除し(つまり、{}の文字のみを残します)、次にawkは、各行の文字をカウントします(これは、{および}文字だけです)。一致しない行を抑制するには、

 sed 's/[^ {}] // g' your_file | awk '/./ {print NR、length}' 

私のソリューションは、探している文字列が単一の文字であることを前提としています(必須)ことに注意してください。メビウスの答えは、複数文字の文字列により簡単に適合します。また、私たちの回答のどちらも、関心のある文字/文字列の引用またはエスケープされた出現を除外しません。例えば。、

{ "nullfunc() {}" }

4つのブレース文字が含まれていると見なされます。

1
Scott