Linux 如何通过bash/shellscript统计文件组中特定单词的出现次数
我有两个文本文件“simple”和“simple1”,其中包含以下数据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.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
工作原理
这告诉awk将每个单词视为记录-vrs='[[:space:]+'
对于以/^h/{i++}
开头的任何记录(字),我们将变量h
增加1i
读取完所有文件后,我们打印出END{print i+0}
的值i
tr
替换为fmt
,后者接受文件名:
fmt -1 simple.txt simple1.txt | grep -i -c -w 'h.*'
(我还对grep做了一些修改,因为我个人觉得这样可读性更好,但这是一个品味问题)
请注意,这两种解决方案(我的和您的原始解决方案)都会将由字母和一个或多个非空格字符组成的字符串(例如字符串haaaa.hbbbb.hccccc)计算为“单个块”,即它只会将“h”字的计数加1,而不是3。这是否是你想要的行为,由你来决定