我有一个包含大约 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 减去文件中的行数。