如何在Bash中实现并行遍历,使患者ID与测量值一一对应替换
Bash实现两个单列文件的一一对应替换
你当前的嵌套循环逻辑错误:外层遍历每个患者ID时,内层会把所有测量值依次替换到同一个患者的文件中,最终每个文件只会保留最后一次替换的测量值。要实现行与行的一一对应映射,需要同时读取两个文件的对应行,而非嵌套循环。
方法一:用paste合并文件后遍历(推荐,效率高)
paste命令可以将两个文件的对应行合并为一行,每行包含患者ID和对应测量值,之后通过while read拆分变量并执行替换:
#!/bin/bash # 合并两个文件的对应行,每行格式为"患者ID 测量值" paste subjects.txt number_of_slices.txt | while read sub slice_count; do # 对目标xmlg文件执行替换操作 sed -i "s/number_of_brain_slices/${slice_count}/g" "/data/mri_measures/analysis/set_files/${sub}.xmlg" done
方法二:按行号读取(兼容含空格的内容)
如果患者ID或测量值包含空格,paste结合read的方式会拆分错误,此时可以通过行号逐行读取两个文件的内容:
#!/bin/bash # 获取文件行数(需确保两个文件行数完全一致) total_lines=$(wc -l < subjects.txt) for ((line_num=1; line_num<=total_lines; line_num++)); do # 读取第line_num行的患者ID和测量值 sub=$(sed -n "${line_num}p" subjects.txt) slice_count=$(sed -n "${line_num}p" number_of_slices.txt) sed -i "s/number_of_brain_slices/${slice_count}/g" "/data/mri_measures/analysis/set_files/${sub}.xmlg" done
注意事项
- 必须保证
subjects.txt和number_of_slices.txt的行数完全相同,否则会出现数据错位或遗漏 - 若使用macOS系统,
sed的-i参数需要添加空字符串作为备份后缀(避免自动生成备份文件),修改为sed -i '' "s/..."
内容的提问来源于stack exchange,提问作者spring-forest
相关产品推荐
相关产品推荐

