如何使用bash批量替换experiments.txt中的旧csv文件路径
执行前提
以下命令均在src/目录下执行。
最终实现方案
可以直接用awk一行搞定,逻辑和你写的Python脚本完全对齐,执行效率更高:
# 生成新文件experiments-2.txt,不修改原文件,兼容性最好 awk ' # 预读data目录下所有csv文件,构建「模型后缀→新路径」的映射 BEGIN { while (("ls ../data/*.csv" | getline csv_path) > 0) { split(csv_path, arr, "-") suffix = arr[length(arr)] file_map[suffix] = csv_path # 把路径分隔符从/替换为\,适配你需要的输出格式 gsub("/", "\\", file_map[suffix]) } } # 逐行处理experiments.txt的内容 { # 提取当前行第一个路径的模型后缀 split($1, arr, "-") suffix = arr[length(arr)] # 替换第一个字段为匹配到的新路径 $1 = file_map[suffix] # 输出修改后的整行内容 print $0 } ' experiments.txt > experiments-2.txt
如果你需要直接修改原experiments.txt,使用GNU awk(大部分Linux发行版默认预装)可以加-i inplace参数实现:
# 直接修改原文件的版本,仅GNU awk 4.1+支持 awk -i inplace ' BEGIN { while (("ls ../data/*.csv" | getline csv_path) > 0) { split(csv_path, arr, "-") suffix = arr[length(arr)] file_map[suffix] = csv_path gsub("/", "\\", file_map[suffix]) } } { split($1, arr, "-") $1 = file_map[arr[length(arr)]] print } ' experiments.txt
注意事项
如果是macOS环境,系统默认自带的是BSD awk,不支持-i inplace参数,使用第一种生成新文件的方案即可。
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

