这是测试样本文件 - 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做到这一点?
答案 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