如何通过bash / shellscript计算文件组中特定单词的出现次数

时间:2018-03-07 01:16:03

标签: linux bash shell unix

我有两个文本文件'simple'和'simple1',其中包含以下数据

    simple.txt--

    hello
    hi hi hello
    this
    is it

    simple1.txt--
    hello hi
    how are you



[]$ tr ' ' '\n' < simple.txt | grep  -i -c '\bh\w*'
4
[]$ tr ' ' '\n' < simple1.txt | grep  -i -c '\bh\w*'
3

此命令显示每个文件以“h”开头的单词数,但我想显示总计数为7,即两个文件的总数。我可以在单个命令/ shell脚本中执行此操作吗?

P.S。:我必须写两个命令,因为tr不带两个文件名。

3 个答案:

答案 0 :(得分:4)

尝试这个,直截了当的方式:

cat simple.txt simple1.txt | tr ' ' '\n' | grep  -i -c '\bh\w*'

答案 1 :(得分:2)

此替代方案不需要管道:

$ awk -v RS='[[:space:]]+' '/^h/{i++} END{print i+0}' simple.txt simple1.txt
7

如何运作

  • -v RS='[[:space:]]+'

    这告诉awk将每个单词视为记录。

  • /^h/{i++}

    对于以h开头的任何记录(单词),我们将变量i增加1。

  • END{print i+0}

    我们读完所有文件后,打印出i的值。

答案 2 :(得分:0)

情况并非如此,tr只接受一个文件名,它不接受任何文件名(并始终从stdin读取)。这就是为什么即使在您的解决方案中,您也没有为tr提供文件名,而是使用了输入重定向。

在您的情况下,我认为您可以将tr替换为fmt,它接受​​文件名:

fmt -1 simple.txt simple1.txt | grep -i -c -w 'h.*'

(我也改变了 grep ,因为我个人认为这种方式更易读,但这是一个品味问题。)

请注意,两个解决方案(我的和原始解决方案)都会计算一个由字母和一个或多个非空格字符组成的字符串 - 例如字符串 haaaa.hbbbbbb.hccccc - 作为& #34;单个块&#34;,即它只会在&#34; h&#34; -words的计数中加1,而不是3.这是否是所需的行为,它取决于你决定。