2017-04-09 89 views
0

这里是测试示例文件 - rime.txt。用grep或sed计算文件中的单词数量?

rime.txt

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

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计数?每行

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

2.to计数的话如何使用sed办呢?

+1

sed和arithmetic不能很好地混合......根据wc手册页,“word是由空格分隔的非零长度的字符序列......”等同于“grep -io”[ ^] *'ip.txt'并计算行数 – Sundeep

+0

grep -io'[^] *'rime.txt | wc -l –

+1

yup,使用wc或类似的数来计算行数......但为什么还要打扰wc -w'在那里? – Sundeep

回答

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}'

+0

@孙德普纠正了thx。 –

+0

为什么num + 0和NR + 0? –

+0

因此,即使输入文件为空,您也可以获得数字输出。尝试在/ dev/null上使用或不使用“+ 0”运行脚本。 –

1

因为它只计算行不是字。从手册页:

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

正如你可以在link you provided看到,有834线和672 SLOC(Source lines of code),以及最后的测量是一个grep的使用。

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 
+1

确定你的意思是在你的答案中使用'grep'而不是'count' – Inian

+0

@Inian他问如何使用'grep',显然不能指望它,但可以用它来提取单词以便在外面计数的。然后,我再次使用'grep'来减少我的投票。 :d –

1

为了澄清失踪的话你的疑问需要在这里一个小例子 -

$cat ff 
hello vipin 
kumar 
good night 

显然, 3行5个字。

尝试用厕所-w一线

$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会给你的行数,而不是字数。