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"
关键修改说明:
- 关联数组映射关系:用
word_pos存储大写词与目标位置的对应关系,word_to_code存储csv中大写词的完整内容。 - 保留输入顺序:用
order数组记录输入的大写词顺序,确保输出字符的顺序和输入参数一致。 - 字符提取逻辑:通过bash字符串切片
${code:$pos:1}提取指定位置字符,注意将输入的数字转换为0起始的索引。 - 结果拼接输出:按顺序提取每个字符后拼接成最终字符串,直接输出结果。
验证输出
执行脚本时传入参数:
./script.sh file.csv SYO2 REZ3 BRB1
输出结果为:
umo
符合预期需求。
内容的提问来源于stack exchange,提问作者GJO2
相关产品推荐
相关产品推荐

