首页 > 试题广场 >

统计每个单词出现的个数

[编程题]统计每个单词出现的个数
  • 热度指数:39169 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
写一个bash脚本以统计一个文本文件nowcoder.txt 中每个单词出现的个数。

为了简单起见,你可以假设:
nowcoder.txt只包括小写字母和空格,每个单词只由小写字母组成,单词间由一个或多个空格字符分隔。

示例:
假设 nowcoder.txt 内容如下:
welcome nowcoder
welcome to nowcoder
nowcoder
你的脚本应当输出(以词频升序排列):
to 1 
welcome 2 
nowcoder 3 

说明:
不要担心个数相同的单词的排序问题,每个单词出现的个数都是唯一的。
示例1

输入

welcome nowcoder
welcome to nowcoder
nowcoder

输出

to 1 
welcome 2 
nowcoder 3 
cat $1  | tr -s ' ' '\n' |sort |uniq -c|sort |awk '{print $2" "$1}'
发表于 2020-11-12 19:41:21 回复(7)
  1. shell
    tr ' ' '\n' | sort | uniq -c | awk '{print $2, $1}' | sort -nk2
  2. awk + sort
    awk '{
     for (i = 1; i <= NF; ++i)
         mp[$i]++;
    }
    END {
     for (k in mp)
         printf("%s %d", k, mp[k]);
    }' | sort -n -k1
发表于 2021-05-15 21:01:12 回复(1)
cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){print $i}}'|sort|uniq -c| sort -n | awk '{print $2,$1}'
发表于 2021-05-27 21:49:31 回复(0)
大数据中的wordcount?
发表于 2021-10-11 21:05:16 回复(1)
cat  ./nowcoder.txt | awk '{for(i=1;i<=NF;i++){arry[$i]++}}END{for(key in arry){print key" "arry[key]}}'
发表于 2020-12-21 10:20:48 回复(0)
awk '{
    for(i = 1 ; i <= NF ; i++){
        array[$i] += 1; 
    }
}
END{
    for(s in array){
        print s" "array[s];
    }
}' nowcoder.txt | sort -k2n

发表于 2022-09-21 18:32:49 回复(0)
awk '{
    for (i=1; i<=NF; i++) {
        arr[$i]++
    }
} END {
    for (j in arr) {
        printf("%s %d", j, arr[j])
    }
}'
发表于 2021-09-03 17:36:31 回复(1)
cat nowcoder.txt | tr -s ' ' '\n' | sort | uniq -c | awk '{print $2" "$1}' | sort -k2n
发表于 2021-04-20 19:28:05 回复(1)
declare -A map

while read linestr
do
    arr=($linestr)
    for key in ${arr[@]}
    do
        if [ -z "${map[$key]}" ];then
            map[$key]=1
        else
            ((map[$key]++))
        fi
    done
done<nowcoder.txt
mm=()
for vlaue in ${map[@]}
do
   mm[${#mm[@]}]=${vlaue}
done





for ((a=0;a<${#mm[*]};a++));do
  for ((k=$a+1;k<${#mm[*]};k++));do
    if [ ${mm[$a]} -gt ${mm[$k]} ];then
        qq=${mm[$a]}
        mm[$a]=${mm[$k]}
        mm[$k]=$qq
    fi
 done
done

for ((k=0;k<${#mm[*]};k++));do
 for key in ${!map[@]};do
    if [ ${map[$key]} -eq ${mm[$k]} ];then
        echo $key ${map[$key]}
    fi
 done
done

发表于 2020-11-11 23:24:59 回复(0)
awk '{for(i=1;i<=NF;i++) a[$i]+=1}END{for(x in a) print x,a[x]}' nowcoder.txt | sort -k 2
发表于 2024-10-30 14:02:26 回复(0)
cat nowcoder.txt | sed 's/ /\n/g' | awk '{word[$1]++}END{for(i in word) print i,word[i];}'

发表于 2021-09-16 18:22:06 回复(0)
#!/bin/bash
declare -A arr
for i in `awk '{print}' nowcoder.txt`; do
    let arr[$i]++
done
for i in ${!arr[*]}; do
    echo "${arr[$i]} ${i}"
done | sort -n | awk '{print $2, $1}'
发表于 2025-08-03 14:46:09 回复(0)
awk '{if($0){for(i=1;i<=NF;i++){a[$i]++;}}}END{PROCINFO["sorted_in"] = "@val_num_asc";for(j in a){print j,a[j]}}' nowcoder.txt
发表于 2024-11-29 17:34:51 回复(0)
sed  's/ /\n/g' nowcoder.txt |  sort | uniq -c |sort|awk '{print $2 $1}'

发表于 2024-11-14 17:17:50 回复(0)
cat nowcoder.txt|awk '
    {
        for(i=1;i<=NF;i++)
            nums[$i]++
    }
    END{
        for(i in nums){
            print i,nums[i]
        }
    }
' | sort -n -k2
发表于 2024-06-30 14:46:02 回复(0)
简洁做法:
#!/bin/bash

# 检查文件 nowcoder.txt 是否存在
if [ ! -f "nowcoder.txt" ]; then
    echo "File nowcoder.txt does not exist."
    exit 1
fi

# 使用 tr 将空格转换为换行符,这样每个单词都在新的一行
# 使用 sort 对单词进行排序,使相同的单词排在一起
# 使用 uniq -c 统计每个单词的出现次数
# 再次使用 sort 对输出进行排序,先按数字排序
cat nowcoder.txt | tr -s ' ' '\n' | sort | uniq -c | sort -n | awk '{print $2, $1}'
高效实现:
#!/bin/bash

# 确保 nowcoder.txt 文件存在
if [ ! -f "nowcoder.txt" ]; then
    echo "File nowcoder.txt does not exist."
    exit 1
fi

# 使用 awk 来统计单词的出现次数
awk '{
    for (i = 1; i <= NF; i++) {
        freq[$i]++
    }
}
END {
    for (word in freq) {
        print word, freq[word]
    }
}' nowcoder.txt | sort -k2,2n -k1,1



发表于 2024-05-22 22:51:24 回复(0)
#!/bin/bash
filename=nowcoder.txt
lookup=$(cat $filename | sed -r 's/ +/\n/g' | sort | uniq)

line=$(cat $filename | sed -r 's/ +/\n/g')

res=""
for word in $lookup;do
  counter=0
  for ele in $line;do
    if [ $ele = $word ];then
      counter=$((counter+1))
    fi
  done
  res+="${word} ${counter}\n"
done

echo -e "$res" | sort -t ' ' -k2,2n



发表于 2024-05-01 17:00:36 回复(0)
awk '{for(i=1;i<=NF;i++){print $i}}' |sort | uniq -c | sort -n | awk '{print $2,$1}'
发表于 2024-02-16 16:40:33 回复(0)
awk '{
    if($0){
        for(i=1;i<=NF;i++){
            mp[$i]++;
        }
    }  
}END{
    for(j in mp){
        printf("%s %d\n",j,mp[j]);
    }
       
}' < nowcoder.txt | sort -k2n
发表于 2023-09-22 10:27:40 回复(0)
cat nowcoder.txt | tr ' ' '\n' | sort | uniq -c | sort | awk '{print $2 " " $1}'
发表于 2023-08-16 10:53:28 回复(0)