如何在Bash中根据CSV映射替换带数字后缀的词并提取指定字母
问题与解决方案
现有资源
- 文件
file.csv内容:
adult,REZ man,BRB women,SYO animal,HIJ
- 输入参数行:
file.csv BRB1 REZ3 SYO2
需求说明
- 依据
file.csv的映射规则(右侧缩写对应左侧英文单词),把参数里带数字后缀的词替换成对应的英文单词 - 提取每个替换后单词中,**对应后缀数字位置(从1开始计数)**的字母
- 最终输出拼接后的结果:
umo
已完成步骤
已经通过以下Bash代码拿到了参数中除文件名外的部分:
for i in "${@:2}" do words+=$(echo "$i ") done
执行后得到:REZ3 BRB1 SYO2
后续实现方案
方式一:用awk一次性完成所有操作
直接借助awk读取映射文件和参数,一步搞定替换与提取:
awk -v args="${@:2}" ' BEGIN { split(args, arr, " ") } { map[$2] = $1 } END { for (i in arr) { # 拆分缩写和数字后缀 match(arr[i], /([A-Z]+)([0-9]+)/, parts) word = map[parts[1]] pos = parts[2] # awk下标从1开始,正好匹配需求的位置计数 printf "%s", substr(word, pos, 1) } print "" } ' file.csv
方式二:基于已获取的words变量继续处理
如果要在你已经得到的words变量基础上接着处理,可以用下面的代码:
# 先把file.csv的映射关系存成bash关联数组 declare -A abbr_map while IFS=, read -r word abbr; do abbr_map[$abbr]=$word done < file.csv # 遍历处理每个带后缀的词,拼接结果 result="" for item in $words; do # 分离缩写部分和数字后缀 abbr=${item%[0-9]} num=${item##[A-Z]} # bash字符串下标从0开始,所以数字要减1 result+=${abbr_map[$abbr]:$((num-1)):1} done # 输出最终结果 echo "$result"
内容的提问来源于stack exchange,提问作者GJO2
相关产品推荐
相关产品推荐

