如何基于特定模式匹配对应csv与tag文件并生成正确组合?
匹配CSV与对应TAG文件的正确组合
现有文件组
CSV文件(组#1)
Axiom_AgDivMS2_apple.r1.annot.csv Axiom_AgDivMS2_favabean.r1.annot.csv Axiom_AgDivMS2_gardenpea.r1.annot.csv Axiom_AgDivMS2_pear.r1.annot.csv Axiom_AgDivMS2_white_lupin.r1.annot.csv
TAG文件(组#2)
feverole_Axiom_AgDivMS2_apple.tag lupin_Axiom_AgDivMS2_apple.tag poire_Axiom_AgDivMS2_apple.tag pois_Axiom_AgDivMS2_apple.tag pomme_Axiom_AgDivMS2_apple.tag feverole_Axiom_AgDivMS2_favabean.tag lupin_Axiom_AgDivMS2_favabean.tag poire_Axiom_AgDivMS2_favabean.tag pois_Axiom_AgDivMS2_favabean.tag pomme_Axiom_AgDivMS2_favabean.tag feverole_Axiom_AgDivMS2_gardenpea.tag lupin_Axiom_AgDivMS2_gardenpea.tag poire_Axiom_AgDivMS2_gardenpea.tag pois_Axiom_AgDivMS2_gardenpea.tag pomme_Axiom_AgDivMS2_gardenpea.tag feverole_Axiom_AgDivMS2_pear.tag lupin_Axiom_AgDivMS2_pear.tag poire_Axiom_AgDivMS2_pear.tag pois_Axiom_AgDivMS2_pear.tag pomme_Axiom_AgDivMS2_pear.tag feverole_Axiom_AgDivMS2_white_lupin.tag lupin_Axiom_AgDivMS2_white_lupin.tag poire_Axiom_AgDivMS2_white_lupin.tag pois_Axiom_AgDivMS2_white_lupin.tag pomme_Axiom_AgDivMS2_white_lupin.tag
需求
将TAG文件中带有*_apple.tag、*_favabean.tag等后缀的文件,与CSV文件中含对应关键词(如apple)的文件匹配。例如所有含apple的TAG文件,仅匹配Axiom_AgDivMS2_apple.r1.annot.csv。
已实现的关键词提取脚本
可从CSV文件名中提取匹配关键词:
for i in *.csv do a=${i%.r1.annot.csv}; b=${a#*_*_} echo $b done
输出结果:
apple favabean gardenpea pear white_lupin
当前脚本的问题
使用双层循环会生成所有文件的全组合,而非仅匹配的组合:
for N in *.csv; do for S in *.tag; do echo ${N} ${S}; done; done
解决方案
方法1:基于CSV提取的关键词过滤TAG文件
利用提取的关键词,精准匹配对应TAG文件:
# 遍历每个CSV文件 for csv_file in *.csv; do # 提取匹配关键词(逻辑与现有提取脚本一致) base="${csv_file%.r1.annot.csv}" keyword="${base#*_*_}" # 筛选所有包含该关键词的TAG文件并输出组合 for tag_file in *"${keyword}".tag; do echo "${csv_file} ${tag_file}" done done
该脚本会输出期望的匹配组合,示例:
Axiom_AgDivMS2_apple.r1.annot.csv feverole_Axiom_AgDivMS2_apple.tag Axiom_AgDivMS2_apple.r1.annot.csv lupin_Axiom_AgDivMS2_apple.tag Axiom_AgDivMS2_apple.r1.annot.csv poire_Axiom_AgDivMS2_apple.tag Axiom_AgDivMS2_apple.r1.annot.csv pois_Axiom_AgDivMS2_apple.tag Axiom_AgDivMS2_apple.r1.annot.csv pomme_Axiom_AgDivMS2_apple.tag
方法2:更通用的映射匹配(适配文件名结构变化)
如果后续文件名结构改变,可先建立关键词与CSV文件的映射,再匹配TAG文件:
# 建立关键词到CSV文件的映射表 declare -A csv_map for csv_file in *.csv; do base="${csv_file%.r1.annot.csv}" keyword="${base#*_*_}" csv_map["${keyword}"]="${csv_file}" done # 遍历TAG文件,匹配对应CSV for tag_file in *.tag; do # 从TAG文件名提取关键词(假设关键词在最后一个_与.tag之间) keyword="${tag_file%.tag}" keyword="${keyword##*_}" # 输出匹配组合 echo "${csv_map["${keyword}"]} ${tag_file}" done
若文件名结构变化,只需调整keyword的提取逻辑即可,比如修改${base#*_*_}或${keyword##*_}的匹配规则。
内容的提问来源于stack exchange,提问作者pedro
相关产品推荐
相关产品推荐

