我有两个文本文件'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不带两个文件名。
答案 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.这是否是所需的行为,它取决于你决定。