You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BASH中解决无多维数组时姓名与销售额排序后的索引同步问题?

嘿,我正好折腾过类似的BASH脚本,给你分享个靠谱的实现方案!因为BASH确实没有原生多维数组,咱们可以通过拼接数组元素再拆分的方式,完美保证姓名和销售额排序后索引一一对应。话不多说,直接上代码和解释:

完整实现脚本
#!/bin/bash

# 初始化存储姓名和销售额的数组
declare -a names=()
declare -a sales=()

# 接收用户输入数据
echo "请输入人员姓名和季度销售额(每行格式:姓名 销售额,输入空行结束):"
while true; do
    read -r line
    # 空行则退出输入循环
    [[ -z "$line" ]] && break
    # 拆分姓名和销售额,存入对应数组(用awk处理更可靠)
    name=$(echo "$line" | awk '{print $1}')
    sale=$(echo "$line" | awk '{print $2}')
    names+=("$name")
    sales+=("$sale")
done

# 显示排序选项菜单
echo -e "\n请选择排序方式:"
echo "1. 按姓名字母顺序排序"
echo "2. 按销售额数值降序排序"
read -r choice

# 根据选择执行排序并更新数组
case $choice in
    1)
        # 按姓名字母排序:拼接两个数组为每行"姓名\t销售额",按第一列排序
        sorted_pairs=$(paste <(printf "%s\n" "${names[@]}") <(printf "%s\n" "${sales[@]}") | sort -k1,1)
        ;;
    2)
        # 按销售额降序排序:按第二列数值倒序(n=数值排序,r=倒序)
        sorted_pairs=$(paste <(printf "%s\n" "${names[@]}") <(printf "%s\n" "${sales[@]}") | sort -k2,2nr)
        ;;
    *)
        echo "无效选项,程序退出"
        exit 1
        ;;
esac

# 将排序后的结果拆分回两个数组,恢复索引对应关系
names=()
sales=()
while IFS=$'\t' read -r name sale; do
    names+=("$name")
    sales+=("$sale")
done <<< "$sorted_pairs"

# 输出排序后的结果
echo -e "\n排序后的结果:"
echo "姓名\t销售额"
for i in "${!names[@]}"; do
    echo "${names[$i]}\t${sales[$i]}"
done
关键逻辑说明
  • 输入处理:用while read循环接收用户输入,空行终止;用awk拆分姓名和销售额,比直接用read name sale更能处理姓名带空格的情况(如果你的需求允许姓名有空格,只需要调整awk的拆分逻辑,比如把$1改成$1 $2这类,或者让用户用引号包裹姓名)。
  • 排序核心:通过paste命令把names和sales数组的元素按行拼接成姓名\t销售额的格式,这样每个姓名和对应的销售额就绑定在同一行里;排序后再通过while read拆分回两个数组,完美保证索引一一对应。
  • 排序参数:
    • sort -k1,1:按第一列(姓名)的字母顺序排序;
    • sort -k2,2nr:按第二列(销售额)的数值降序排序,n表示按数值而非字符串比较,r表示倒序。

你可以直接把这段代码保存为sort_sales.sh,赋予执行权限chmod +x sort_sales.sh后运行测试,亲测有效!

内容的提问来源于stack exchange,提问作者D'Arcy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:54:33