grep -c
は、ファイル内で文字列が出現する回数を見つけるのに役立ちます、ただし、各発生は1行に1回だけカウントされます。 1行あたりの複数の出現をカウントする方法は?
次よりもエレガントなものを探しています:
perl -e "$_ = <>; print scalar ( () = m/needle/g ), "\n""
コメント
回答
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
コメント
\ <ニードル\ > 'ファイル| 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回だけ 必要な場合)簡単に拡張できます。
コメント
回答
別の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:]]
は、すべての非英字を包含します。
コメント
回答
これは私の純粋な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}"
コメント
grep
が指定されていることは知っていますが、ack
を使用している場合、答えは単に。