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

如何在Bash中根据CSV映射替换带数字后缀的词并提取指定字母

问题与解决方案

现有资源

  • 文件file.csv内容:
adult,REZ
man,BRB
women,SYO
animal,HIJ
  • 输入参数行:file.csv BRB1 REZ3 SYO2

需求说明

  1. 依据file.csv的映射规则(右侧缩写对应左侧英文单词),把参数里带数字后缀的词替换成对应的英文单词
  2. 提取每个替换后单词中,**对应后缀数字位置(从1开始计数)**的字母
  3. 最终输出拼接后的结果: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:45:11