计算input文件中string的出现次数

有一个shell脚本应该处理传入的文本文件。

此文本文件包含分割成多行的string,每个string都存在多次。

shell脚本需要读取这个文本文件并输出每个string的string和计数。

考虑这个文本文件是:

蒂姆

蒂姆

标记

标记

艾伦

艾伦

艾伦

输出应该是这样的:

蒂姆出现2次

马克出现2次

艾伦出现3次

现在,我可以打印string的发生,但重复的string出现的次数,即“Tim出现2次”打印两次。 我试图用NULLreplace一个string,只要我计算它的发生,但由于某种原因,sed不工作,因为也许我不是在正确的地方(或以正确的方式)调用它,

#!/bin/bash INPUT_FILE="$1" declare -a LIST_CHARS if [ $# -ne 1 ] then echo "Usage: $0 <file_name>" exit 1 fi if [ ! -f $INPUT_FILE ] then echo "$INPUT_FILE does not exists. Please specify correct file name" exit 2 fi while read line do while read i do echo $line count=`grep -i $line | wc -l` echo "String $line appears $count times" done < $INPUT_FILE done < $INPUT_FILE 

Solutions Collecting From Web of "计算input文件中string的出现次数"

经典的awk解决方案如下所示:

 $ awk'NF {count [toupper($ 0)] ++} 
     END {for(name in count){print name“appear”count [name]“times”};
 }'输入

你也可以使用sort和uniq标志来忽略大小写:

 sort -f FILE | uniq -ic 

简单的sed命令可以将输出格式更改为指定的格式:

 s/^ *\([0-9]\+\) \(.*\)/\2 appears \1 times/ 

假设data.txt包含你的单词下面的脚本将做。

 while read line do uc=$(echo $line | tr [az] [AZ] | tr -d ' ') echo $uc $(grep -i "$uc" strs.txt | wc -l) done< data.txt | sort | uniq 

输出。

 31 ALLEN 6 MARK 4 MOKADDIM 1 SHIPLU 1 TIM 4 

另一个选择是

 sort -f data.txt | uniq -i -c | while read num word do echo $(echo $word|tr [az] [AZ]) appeard $num times done 

注意:我看到你的文本文件包含空行。 因此,输出中的31包含空行的数量。

 for i in `sort filename |uniq -c`` do # --if to print data as u like-- done