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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:07:26