如何基于行对应关系批量修改文本文件内容的命名格式
批量替换文本行前缀(保留后缀)的几种方法
这种逐行对应替换前缀的需求,用awk来处理最高效,一行命令就能搞定,完全不用写复杂脚本!
方法一:用awk快速处理
假设你的f1.txt每行格式是前缀_后缀(比如subj00003_xyz),f2.txt每行是要替换的新前缀(比如subj0004_01),直接运行这条命令:
paste f1.txt f2.txt | awk '{n = index($1, "_"); print $2 substr($1, n)}' > output.txt
命令拆解:
paste f1.txt f2.txt:把两个文件的对应行合并成一行,用制表符分隔(比如subj00003_xyz subj0004_01)index($1, "_"):找到f1行里第一个下划线的位置substr($1, n):截取f1行里从下划线开始的所有内容(也就是要保留的后缀部分)print $2 substr($1, n):把f2的内容和后缀拼接,输出新行> output.txt:把结果保存到新文件里
这个写法特别稳妥,哪怕你的后缀里包含多个下划线(比如subj00003_abc_def),也能完整保留所有后缀内容。
方法二:Python脚本(适合灵活扩展)
如果你不太熟悉shell命令,或者需要更复杂的逻辑(比如处理空行、更换分隔符),用Python写个小脚本更直观:
# 打开三个文件:读f1、读f2、写结果 with open('f1.txt', 'r') as f1, open('f2.txt', 'r') as f2, open('output.txt', 'w') as output_file: # 逐行配对读取两个文件 for line_f1, line_f2 in zip(f1, f2): # 去掉每行末尾的换行符和空白 line_f1_clean = line_f1.strip() line_f2_clean = line_f2.strip() # 处理没有后缀的情况(f1行里没有下划线) if '_' not in line_f1_clean: output_line = line_f2_clean else: # 只分割第一个下划线,保留后面所有内容 _, suffix = line_f1_clean.split('_', 1) output_line = f"{line_f2_clean}_{suffix}" # 写入结果文件,加上换行符 output_file.write(output_line + '\n')
脚本优势:
- 逻辑清晰,容易修改(比如把分隔符从
_改成.,只需要修改split的参数) - 自动处理空行(如果某行是空的,也能正常对应)
- 适合需要后续扩展功能的场景(比如过滤特定行、批量处理多个文件)
验证结果
运行完命令或脚本后,打开output.txt就能看到替换后的内容啦,比如:
f1.txt行:subj00003_xyz
f2.txt行:subj0004_01
output.txt行:subj0004_01_xyz
完全符合你的需求!
内容的提问来源于stack exchange,提问作者hsayya
相关产品推荐
相关产品推荐

