Grep:行ごとの一致数のカウント


26

私は(この場合は、の出現にマッチ数を取得しようとしている{か、}.texファイルの各行に)。

-oフラグは一致のみを返すことを知っていますが、フラグと組み合わせても新しい行に各一致を返します-n。繰り返しをカウントするためにこれをパイプ処理できるものは何も知りません。-cフラグはファイル全体にマッチの総数を返します-多分私は一度にパイプ1ラインはgrepをするだろうか?

回答:


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

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

3 1
1 2

1行目に3回、2行目に1回の意味。

/programming//a/15366097/3378354から取得


ありがとう-グーグルはSUで多くの正規表現ヒットを見つけましたが、SOではそうではなく、正規表現タグさえ持っていないようです。sortgrepの出力は行番号でソートされるため、これは厳密には必要ありませんが、以前は良い習慣だったと思いuniqます。
クリスH 14年

2
おそらくregex正規表現は簡単な部分であるため、タグ付けされていません。
トムザイチ14年

実際に必要sort -nですか?とにかく行番号順に出てこないのですか?
トムザイチ14年

あなたは正しい、sort -n必要ではありません。ありがとう。
メビウス14年

@TomZych、あなたは正しかったことが判明しましたが、私は尋ねなかったかもしれないことを知っていました。grepからtag:regexへのメンタルジャンプは、おそらく少し多すぎました。
クリスH 14年

3

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

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

3
私の意見では、最善の解決策です。パイプを1つ減らすことで、さらに簡素化できますgrep -o "matchingString" <<< $i | wc -l
ベンジャミンW.

1
これは遅く、その後桁違いになります他のオプションけれども
ラーフル

1

grep要件を使用していますか?代替手段は次のとおりです。

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

sed以外のすべての文字アウトのストリップ{} (すなわち、のみ残し{}文字)、その後、awk(ちょうどある各行の数文字{}文字)。一致しない行を抑制するには、

sed 's / [^ {}] // g' your_file | awk '/./ {印刷NR、長さ}'

私のソリューションは、探している文字列が単一の文字であると仮定していることに注意してください。Moebiusの答えは、複数文字の文字列により簡単に適合します。また、いずれの回答も、対象となる文字/文字列の引用またはエスケープされた出現を除外しません。例えば、

{ "nullfunc() {}" }

4つの中括弧文字が含まれていると見なされます。


grep本当に要件ではありませんでした。解決策を探し始めたところです。私はawkを必要としなかったので、上記の答えを使用していなかったなら、これを実験の機会として使用していたでしょう-まだかもしれません。私が明らかにしなかったのは(しかし、どちらの答えにも影響しません)、ほとんどのペアが発生するミスマッチ(LaTeXソースでは、ここでは表)を追跡するために、ブラケットごとに1回スクリプトを実行したかったということです単一の行。
クリスH 14年

「括弧ごとにスクリプトを1回実行する」という意味がよくわかりませんが、ブレースの不一致を追跡する場合sed 's/{[^{}]*}//g' your_file | grep –n '[{}]'は、sedストリップ(一致)ペアを削除するなどの方法を試してください。ネストされたペアがある場合は、を使用してsed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …s/{[^{}]*}//g最も深いネストと同じ回数だけ繰り返します。
スコット14年

'sed' s / [^}] // g 'your_fileを実行することを意味しました| awk '{print NR、length}'および 's / [^ {] // g' your_file | awk '{print NR、length}'。私は実際にネスティングを行っており、最も深いレベルでの作業は面倒な作業のように思えました。多くの行を一握りに変える(有効な理由でブレースが複数の行にのみ一致するいくつかのケースがあります)絞り込む必要があります)。
クリスH 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.