MST

星途 面试题库

面试题:Bash关联数组的复杂应用

在Bash中,关联数组相较于普通数组有哪些不同?编写一个Bash脚本,使用关联数组来统计一段文本文件中每个单词出现的次数,并按出现次数从高到低输出单词及其出现次数。
46.1万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

关联数组相较于普通数组的不同

  1. 索引类型
    • 普通数组:普通数组使用整数作为索引,索引从0开始,按顺序递增。例如:array=(element1 element2 element3),可以通过${array[0]}${array[1]}等方式访问元素。
    • 关联数组:关联数组使用字符串作为索引,也称为键(key)。这使得数组的索引更加灵活,可以使用有意义的字符串作为索引,而不局限于数字。例如:declare -A assoc_array,然后可以通过assoc_array[key1]=value1来赋值。
  2. 声明方式
    • 普通数组:无需特殊声明,直接通过赋值方式创建,如array=(value1 value2)
    • 关联数组:需要使用declare -A声明。例如:declare -A assoc_array
  3. 访问元素
    • 普通数组:通过整数索引访问,如${array[1]}
    • 关联数组:通过字符串键访问,如${assoc_array[key1]}

统计文本文件中单词出现次数并按次数从高到低输出的Bash脚本

#!/bin/bash

# 声明关联数组
declare -A word_count

# 读取文件内容并统计单词出现次数
while read -r line; do
    for word in $line; do
        # 去除单词两端的标点符号等非字母数字字符
        word=$(echo $word | tr -cd '[:alnum:]\n')
        if [ -z "$word" ]; then
            continue
        fi
        if [ -v word_count[$word] ]; then
            word_count[$word]=$((word_count[$word]+1))
        else
            word_count[$word]=1
        fi
    done
done < input.txt

# 按出现次数从高到低排序并输出
for word in $(echo ${!word_count[@]} | tr ' ' '\n' | sort -rn -k1 -t$'\t' -s -u | while read -r w; do echo -e "${word_count[$w]}\t$w"; done | sort -rn -k1 -t$'\t' | cut -f2); do
    echo "$word: ${word_count[$word]}"
done

在上述脚本中:

  1. 首先声明了一个关联数组word_count用于统计单词出现的次数。
  2. 通过while read -r line逐行读取文本文件input.txt的内容。
  3. 对每行中的每个单词进行处理,去除非字母数字字符,然后统计单词出现的次数。
  4. 最后,通过一系列sort命令对关联数组按出现次数从高到低排序并输出单词及其出现次数。