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

Bash脚本问题:替换大写词并提取对应位置字符以得到指定输出

问题描述

现有file.csv文件内容如下:

adult,REZ
man,BRB
women,SYO
animal,HIJ

另有一行输入内容:

file.csv SYO2 REZ3 BRB1

需求是:根据该行中带数字的大写词,从file.csv中找到对应大写词的行,提取该大写词中数字指定位置的字符(大写),最终输出应为umo。

现有Bash脚本:

#!/bin/bash
filename="$1"
string=""
for i in "${@:2}"
do
words=$(echo "$i" | grep -oE '[A-Z]+')
number=$(echo "$i" | grep -oE '[0-9]+')
string+=$(echo "$words|")
numbers+=$(echo "$number|")
done
string=${string%|*}
numbers=${numbers%|*}
while IFS= read -r line
do
    line1=$(echo $line | grep -oE $string)
if [[ -n $line1 ]] 
    then 
      echo $line 
    fi
done < $filename

当前输出为:

man, BRB
adult, REZ
women, SYO

无法关联大写词与对应数字,也无法保证顺序,需要修改脚本实现需求。

解决方案

要实现需求,核心是关联每个大写词和对应的位置数字,并按输入的顺序处理每个词,最后提取对应字符拼接输出。修改后的脚本如下:

#!/bin/bash
filename="$1"

# 用关联数组存储大写词对应的位置(bash数组索引从0开始,需将输入数字减1)
declare -A word_pos
# 保存输入词的顺序,保证输出字符顺序与输入一致
order=()

# 解析输入的带数字大写词,填充数组和顺序列表
for i in "${@:2}"
do
    word=$(echo "$i" | grep -oE '[A-Z]+')
    num=$(echo "$i" | grep -oE '[0-9]+')
    pos=$((num - 1))
    word_pos["$word"]=$pos
    order+=("$word")
done

# 读取csv文件,构建大写词到自身的映射
declare -A word_to_code
while IFS=, read -r _ code
do
    word_to_code["$code"]=$code
done < "$filename"

# 按输入顺序提取对应位置的字符,拼接结果
result=""
for word in "${order[@]}"
do
    code=${word_to_code["$word"]}
    pos=${word_pos["$word"]}
    # 用bash字符串切片提取指定位置的字符
    char=${code:$pos:1}
    result+="$char"
done

echo "$result"

关键修改说明:

  1. 关联数组映射关系:用word_pos存储大写词与目标位置的对应关系,word_to_code存储csv中大写词的完整内容。
  2. 保留输入顺序:用order数组记录输入的大写词顺序,确保输出字符的顺序和输入参数一致。
  3. 字符提取逻辑:通过bash字符串切片${code:$pos:1}提取指定位置字符,注意将输入的数字转换为0起始的索引。
  4. 结果拼接输出:按顺序提取每个字符后拼接成最终字符串,直接输出结果。

验证输出

执行脚本时传入参数:

./script.sh file.csv SYO2 REZ3 BRB1

输出结果为:

umo

符合预期需求。

内容的提问来源于stack exchange,提问作者GJO2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:30:42