使用unix shell计算一个字符在多个文件中出现的次数

使用unix shell计算一个字符在多个文件中出现的次数,shell,unix,Shell,Unix,我想帮助我的女朋友-她需要大约200个文件(每个文件)中特定字符的具体计数 我已经找到了,但这只显示了完整的数字,而不是每个文件的出现次数。基本上,我想要的是: $ ls test1 test2 $ cat test1 ddddnnnn ddnnddnnnn $ cat test2 ddnnddnnnn $ grep -o 'n' * | wc -w 16 $ <insert command here> test1 10 test2 6 $ $ls 测试1测试2 $cat t

我想帮助我的女朋友-她需要大约200个文件(每个文件)中特定字符的具体计数

我已经找到了,但这只显示了完整的数字,而不是每个文件的出现次数。基本上,我想要的是:

$ ls 
test1   test2
$ cat test1
ddddnnnn
ddnnddnnnn
$ cat test2
ddnnddnnnn
$ grep -o 'n' * | wc -w
16
$ <insert command here>
test1 10
test2 6
$
$ls
测试1测试2
$cat test1
ddnnnn
ddnnddnnnn
$cat test2
ddnnddnnnn
$grep-o'n'*| wc-w
16
$ 
测试110
测试2 6
$

或者关于输出类似的东西。由于这将在她的大学机器上,我不能用perl或其他语言编写任何代码,只允许使用shell。我对shell的了解有点生疏,所以我想不出更好的解决方案-也许你可以帮我。

这并不完美,但最明显的解决方案是:

letter='n'
for file in *; do
    count=`grep -o $letter "$file" | wc -w`
    echo "$file contains $letter $count times"
done
产生

 10 test1:n
  6 test2:n
如果您想要准确的输出:

grep -Ho n * | uniq -c | while read count file; do echo "${file%:n} $count"; done

Glen的答案更适合于支持它的UNIX风格。这将适用于声称符合POSIX的UNIX。这是为穷人准备的,他们没有其他答案。 POSIX grep没有提到
grep-H-o
See:
http://pubs.opengroup.org/onlinepubs/009604499/utilities/grep.html

获取所需文件的列表,称之为list.txt。我无缘无故地选择了字符^==shift 6

while read fname
do
  cnt=`tr -dc '^' < $fname | wc -c`
  echo "$fname: $cnt"
done < list.txt
读取fname时

做
cnt=`tr-dc'^'<$fname | wc-c`
echo“$fname:$cnt”
完成
对于*
中的文件,比
对于$(ls)中的文件更可取。
--
while read fname
do
  cnt=`tr -dc '^' < $fname | wc -c`
  echo "$fname: $cnt"
done < list.txt