grep -cは、ファイル内で文字列が出現する回数を見つけるのに役立ちます、ただし、各発生は1行に1回だけカウントされます。 1行あたりの複数の出現をカウントする方法は?

次よりもエレガントなものを探しています:

perl -e "$_ = <>; print scalar ( () = m/needle/g ), "\n"" 

コメント

  • grepが指定されていることは知っていますが、ackを使用している場合、答えは単に

  • @KyleStrand For me ack -ch < pattern >オカレンスのある行のみをカウントし、オカレンスの数はカウントしませんでした
  • @MarcKeesマニュアルページを見ると、正しい動作のように聞こえます。指摘していただきありがとうございます!
  • 回答

    grep “s -oは、行を無視して、一致のみを出力します。 wcはそれらを数えることができます:

    grep -o "needle" file | wc -l 

    これは「針」または「多針」にも一致します。

    1つの単語のみに一致させるには、次のいずれかのコマンドを使用します。

    grep -ow "needle" file | wc -l grep -o "\bneedle\b" file | wc -l grep -o "\<needle\>" file | wc -l 

    コメント

    • これにはGNUgrep(Linux、Cygwin、FreeBSD、OSX)が必要であることに注意してください。
    • @wag \bおよび\Bここで行いますか?
    • @Geek \ bは単語の境界に一致し、\ Bは単語の境界に一致しません。上記の答えは、両端で\ bを使用した方が正しいでしょう。
    • 1行あたりの出現回数については、grep-nオプションおよびuniq-c … grep -no

    \ <ニードル\ > 'ファイル| uniq -c

  • @jameswarren uniqは隣接する同一の行のみを削除します。ivにフィードする前にsortする必要がありますid = “604374c00f”>
  • 重複が常にすぐ隣にあるかどうかまだわからない場合。

    回答

    GNU grepを使用している場合(常にLinuxとCygwinで、場合によっては他の場所で)、 grep -o grep -o needle | wc -l

    Perlを使用すると、(

    修正済み)。

    perl -lne "END {print $c} map ++$c, /needle/g" perl -lne "END {print $c} $c += s/needle//g" perl -lne "END {print $c} ++$c while /needle/g" 

    POSIXツールのみを使用する場合、可能であれば、1つのアプローチはgrepに渡す前に、単一の一致で行に入力します。たとえば、「単語全体を探している場合は、最初に単語以外のすべての文字を新しい行に変換します。

    # equivalent to grep -ow "needle" | wc -l tr -c "[:alnum:]" "[\n*]" | grep -c "^needle$" 

    それ以外の場合、これを行うための標準コマンドはありません。 s特定のテキスト処理なので、sed(マゾヒストの場合)またはawkを使用する必要があります。

    awk "{while (match($0, /set/)) {++c; $0=substr($0, RSTART+RLENGTH)}} END {print c}" sed -n -e "s/set/\n&\n/g" -e "s/^/\n/" -e "s/$/\n/" \ -e "s/\n[^\n]*\n/\n/g" -e "s/^\n//" -e "s/\n$//" \ -e "/./p" | wc -l 

    ここではsedおよびgrepは、文字列または本の正規表現でも機能しますが、アンカーパターンのあるいくつかのコーナーケースでは失敗します(例えばneedleneedle^needleまたは\bneedleが2回検出されます。

    sed "s/needle/\n&\n/g" | grep -cx "needle" 

    上記のsed置換では、改行を意味するために\nを使用したことに注意してください。これはパターン部分では標準ですが、置換テキストでは、移植性のために、\nの代わりにバックスラッシュ改行を使用してください。

    回答

    私のように、実際に「両方;それぞれが1回だけ」(これは実際には「どちらか; 2回」)が必要な場合は、簡単です。 :

    grep -E "thing1|thing2" -c 

    出力を確認します2

    このアプローチの利点(1回だけ 必要な場合)簡単に拡張できます。

    コメント

    • I ' '実際に確認しているのかわからない' 1回しか表示されないのですか?'これらの単語のいずれかが少なくとも1回は存在することを探しています。
    • これは受け入れられる答えです。、grepには、物事を数えるための組み込みオプションがあり、明白な名前も付けられています「カウント」の-cとして!

    回答

    別のawkとneedleをフィールド区切り文字として使用するソリューション:

    awk -F"^needle | needle | needle$" "{c+=NF-1}END{print c}" 

    の後に句読点を付け、それに応じてフィールド区切り文字を変更します。つまり、

    awk -F"^needle[ ,.?]|[ ,.?]needle[ ,.?]|[ ,.?]needle$" "{c+=NF-1}END{print c}" 

    またはクラスを使用します:[^[:alnum:]]は、すべての非英字を包含します。

    コメント

    • これには、正規表現フィールド区切り文字をサポートするawk(GNU awkなど)が必要であることに注意してください。

    回答

    これは私の純粋なbashソリューションです

    #!/bin/bash B=$(for i in $(cat /tmp/a | sort -u); do echo "$(grep $i /tmp/a | wc -l) $i" done) echo "$B" | sort --reverse 

    回答

    この例では、ファイル内の合計ではなく、1行あたりの出現回数のみが出力されます。 それが必要な場合は、次のように機能する可能性があります:

    perl -nle "$c+=scalar(()=m/needle/g);END{print $c}" 

    コメント

    • あなた 正しいです-私の例では、最初の行の出現のみをカウントします。