一部の行は興味があり、他の行は興味のない巨大なテキストファイルを解析する必要があります。興味のあるものの中で、特定のキーワードの発生回数を計算する必要があります。
ファイルが呼び出され、input.txt
次のように仮定します。
format300,format250,format300
format250,ignore,format160,format300,format300
format250,format250,format300
ignore
行を除いて数を計算したいのですが、format300
どうすればよいですか?
これまで私が得たのは次のコマンドです。このコマンドは各行を一度だけ計算します(十分ではありません)。
cat input.txt | grep -v ignore | grep 'format300' | wc -l
どんな提案がありますか?可能であれば、Perlを使用したくありません。
答え1
この行はあなたが望むことができるはずです:
grep -v ignore input.txt | sed 's/format300/format300\n/g' | grep -c "format300"
デフォルトでは、キーワードの各項目をキーワード自体と改行文字に置き換えると、入力ストリームが効果的に与えられた行にキーワードを一度だけ持つことになります。次に、grep -c
キーワードを含む行数を計算します。
答え2
最初のものは必要ありませんcat
。猫の不要な使用(UUOC)。
また、非常に便利なことに、grep -o
一致するパターンを1行に1つずつ出力します。
次に、行数を計算しますwc -l
。
grep -v ignore YOUR_FILE | grep -o format300 | wc -l
これにより、3
小さなサンプルが印刷されます。
答え3
入力ファイルには部分一致が含まれ、結果が無効になる可能性があります。たとえば、次のようになります。
1 format300,format250,format300
2 format250,ignore,format160,format300,format300
3 format250,format250,format300
4 format999,format300000,format999
5 format999,ignore_me_not,format300
4行目には部分文字列が含まれているformat300000
ため、4行目を数えるか5行目を無視したくありません。ignore_me_not
ignore
これにより、トリックを実行できます。
grep -v "\bignore\b" FILE |grep -o "\bformat300\b"|wc -l
正しい出力は
4
..2行は無視されるため、5行は無視されず、4行は完全には含まれませんformat300
。
部品を取り出すと、wc -l
正確に一致するものを確認できます。
答え4
パール方式:
perl -lne '$k+=(s/format300//g) unless /ignore/; }{ print $k' input.txt
s/format300//g
すべての項目を null に置き換え、置換format300
回数を返します。これは、発生回数を計算する簡単な方法です。その後、数字が追加されて$k
行が一致しない場合にのみ、すべてが発生しますignore
。これは}{
、「ファイルを読んだ後にこれを実行すると、print $k
見つかった総数が印刷されます」のPerlの略語です。