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

Linux 如何通过bash/shellscript统计文件组中特定单词的出现次数,linux,bash,shell,unix,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

我有两个文本文件“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
simple.txt--
你好
你好你好你好
这
它是
simple1.txt--
你好你好
你好吗
[]$tr''\n'
此命令显示每个文件以“h”开头的字数,但我希望显示总计数为7,即两个文件的总数。我可以在单个命令/shell脚本中执行此操作吗


注意:我必须编写两个命令,因为tr不接受两个文件名。

试试这个,简单的方法:

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

该替代方案不需要管道:

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

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

  • /^h/{i++}

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

  • END{print i+0}

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


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

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

fmt -1 simple.txt simple1.txt | grep -i -c -w 'h.*'
(我还对grep做了一些修改,因为我个人觉得这样可读性更好,但这是一个品味问题)

请注意,这两种解决方案(我的和您的原始解决方案)都会将由字母和一个或多个非空格字符组成的字符串(例如字符串haaaa.hbbbb.hccccc)计算为“单个块”,即它只会将“h”字的计数加1,而不是3。这是否是你想要的行为,由你来决定