web-dev-qa-db-ja.com

CSVファイルの列で部分文字列を検索する

約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」という単語の出現をカウントするにはどうすればよいですか?

2

これを試して、

 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
Siva

この問題に取り組む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からファイルの行数を引いた数を出力します。

0
Rakesh Sharma