使用grep或sed计算文件中的单词?

时间:2017-04-09 13:20:16

标签: bash awk sed

这是测试样本文件 - rime.txt。

rime.txt

1.计算文件中的所有单词。

wc -w rime.txt
4081 rime.txt
awk 'BEGIN{num=0}{split($0, A);n=length(A);num=num+n;}END{print num}'  rime.txt
4081

grep -Ec  '\w' rime.txt
672

为什么grep的总字数是672? 如何用sed计算?

2.计算每行字数

awk '{split($0, A);print length(A)}'  rime.txt

如何用sed做到这一点?

4 个答案:

答案 0 :(得分:3)

grep是countig行,而不是单词,你永远不会使用sed,因为sed是针对各行的简单替换,就是全部。

此外,那些awk脚本是荒谬的。写第一个的正确方法是awk '{num+=NF} END{print num+0}'或GNU awk awk -v RS='[[:space:]]+' 'END{print NR+0}',第二个只是awk '{print NF}'

答案 1 :(得分:1)

因为它只计算行而不是单词。从手册页:

  

-c, - count                 抑制正常输出;而是打印匹配行的计数                 对于每个输入文件。使用-v, - inverse-match选项(参见                 在下面),计算不匹配的行。

正如您在link you provided上看到的那样,有834行和672 SLOC(Source lines of code),最后一次测量是grep使用的。

答案 2 :(得分:1)

为澄清您对遗失单词的疑问,请在此处举一个小例子 -

$cat ff
hello vipin
kumar
good night

显然,3行5个字。

尝试使用wc -w first-

$wc -w ff
5 ff  

和您使用的grep命令 -

$grep -Ec '\w' ff
3 

在您的情况下总计行数 -

$wc -l < file.txt 
833

空白行总数 -

$grep '^$' file.txt |wc -l
161

总非空行数 -

$grep -v '^$' file.txt |wc -l
672

这就是你看到672行的原因。

$echo $(expr 833 - 161)
672

正如专家已经提到过你不应该使用sed进行此操作,grep \ w会给你的行数,而不是字数。

答案 3 :(得分:0)

如果你想使用grep来完成这项工作,首先要形成一个类似于一个单词的正则表达式,我将使用它:[a-zA-Z'-]并让你弄清楚一个更好的一个。然后使用grep -o进行匹配:

   -o, --only-matching
          Print only the matched (non-empty) parts  of  a  matching  line,
          with each such part on a separate output line.

最后用wc -l计算匹配次数:

$ grep -o [a-zA-Z'-] rime.txt | wc -l
4090