如何在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
相关产品推荐
相关产品推荐

