約15000行と複数の列を持つcsvファイルがあります。データセットは次のようになります。
A,B,C, message D, E, F
a,b,c,Hi how are you ? d,e,f
a,b,c,Hi Hello.Are you ok? d,e,f
a,b,This >are< should not be counted,d,e,f
a,b,c,Hi I'm good. Are you ok ? d,e,f
a,b,c,Hi You are good, are you? d,e,f
a,b,c,I dare to add this line d,e,f
ここで、UNIXシェルコマンドを使用して、メッセージ列の「are」という単語の出現をカウントするにはどうすればよいですか?
これを試して、
grep -oc are file
-o
一致した部分のみを印刷します。-c
一致する行の数を出力します。あなたは付け加えられます -i
オプションもAre
の結果が必要な場合。一致するパターンの大文字と小文字を区別するものは無視されます
同じ行に複数の一致するパターンがある場合...
grep -o are file | wc -l
AWKの使用:
awk -F ',' '$4 ~ /are/ {count++} END{print count}' file
awk -F ',' '$4 ~ /[Aa]re/ {count++} END{print count}' file
この問題に取り組む2つの方法があります:
sed -Ee '
y/,/\n/;s/\n/,/3;s//,/3;y/\n,/,\n/
s/.*\n(.*)\n.*/\1/;s/\<[aA][rR][eE]\>/\n/g
s/[^\n]*//g;/\n/!d;s///
' file.csv | wc -l
ここでは、GNU sed
を拡張正規表現モードで使用しています。アイデアは、最初に4番目のフィールドを分離し、次に大文字と小文字を区別しない方法で、パターンスペースで見つかったすべてのWordを改行に変換することです。次に、改行以外の行をすべて削除し、stdoutに何かを出力するたびに、改行をsed
配置する代わりに改行を削除します。次に、sed
によって出力された行数をカウントします。これにより、すべての行の4番目のフィールドにある単語「are」の大文字と小文字を区別しないすべてのパターンの合計が得られます。
Perl -F, -lane '
$k += split /(?<=\Ware)(?=\W)/i, $F[3];
}{print $k-$.;
' file.csv
Perl
4番目のフィールド($F[3]
)を大文字と小文字を区別しない単語 "are"で分割します。これは、両端を\ Wsで囲む "are"によって決定されます。次に、分割されたフィールド数の数を更新します。フィールドは常に「are」ワードの数より1多いことに注意してください。
すべての行が読み取られて処理された最後に、kountからファイルの行数を引いた数を出力します。