在 CSV 文件的列中查找子字符串

在 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 shell 命令来计算消息列中单词“are”的出现次数?

答案1

尝试这个,

 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这里我们在扩展正则表达式模式下使用and 。这个想法是首先隔离第四个字段,然后以不区分大小写的方式将现在在模式空间中找到的所有单词“are”转换为换行符。然后删除所有非换行符并删除换行符,而不是sed每次将内容打印到标准输出时放置它自己的换行符。然后我们计算输出的行数,sed这将给出每行第四个字段中单词“are”的所有不区分大小写的模式的总和。

perl -F, -lane '
   $k += split /(?<=\Ware)(?=\W)/i, $F[3];
   }{print $k-$.;
' file.csv

Perl我们将第四个字段 ( $F[3]) 围绕不区分大小写的单词“are”分割,该单词由两端用 \Ws 围绕“are”确定。然后我们更新分割字段的数量。请注意,字段应始终比“are”单词的数量多 1。

最后,当所有行都被读取和处理后,我们打印 kount 减去文件中的行数。

相关内容