如何将文件B中同索引的描述替换为文件A对应索引的描述?
问题描述
现有两个文本文件A和B,每行格式为key 描述,示例如下:
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark
其中UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104是key,/users/documents/ark是描述。
文件基本特征:
- 文件A有1000条条目,文件B有100000条条目
- 每个key可拆分为index(如
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2)和timestamp(如0000027_0000104),index是key去掉最后两个下划线分割的部分 - 每个key和index在对应文件中唯一;文件A的所有index都存在于文件B中,但timestamp不同
需求:将文件B中与文件A拥有相同index的条目,把描述替换为文件A对应index的描述,最终保留文件B的所有条目,仅替换匹配项的描述。
示例:
文件A内容:
UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000000_0000119 /users/documents/ark1 UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark2
文件B内容:
UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark3 UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark4 UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
处理后文件B预期结果:
UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1 UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2 UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
解决方案
以下两种方法都可以实现需求,优先推荐awk命令,适合高效处理大文件。
方法一:使用awk命令(推荐,快速处理大文件)
awk是处理文本的高效工具,适合处理10万条级别的文件B,无需额外依赖,直接在终端执行:
awk ' # 处理第一个输入文件fileA,构建index到描述的映射 NR==FNR { split($1, key_parts, "_") # 拼接index:取key分割后的前n-2个部分(去掉最后两个timestamp部分) index_str = key_parts[1] for (i=2; i<=length(key_parts)-2; i++) { index_str = index_str "_" key_parts[i] } desc_map[index_str] = $2 next } # 处理第二个输入文件fileB { split($1, key_parts, "_") index_str = key_parts[1] for (i=2; i<=length(key_parts)-2; i++) { index_str = index_str "_" key_parts[i] } # 检查当前index是否在映射中,存在则替换描述,否则保留原行 if (index_str in desc_map) { print $1, desc_map[index_str] } else { print $0 } } ' fileA fileB > updated_fileB
说明:
NR==FNR:仅在处理第一个文件(fileA)时执行这段逻辑,将每个条目的index和对应描述存入desc_map关联数组。- 处理fileB时,提取每条的index,若在
desc_map中存在,则输出原key+替换后的描述;否则输出原行。 - 最终结果会写入
updated_fileB,不会修改原文件B,避免数据丢失。
方法二:使用Python脚本(适合自定义逻辑场景)
如果需要更灵活的扩展,或者熟悉Python,可以用以下脚本:
# 构建index到描述的映射字典 index_desc = {} # 读取文件A with open("fileA", "r", encoding="utf-8") as f_a: for line in f_a: line = line.strip() if not line: continue # 分割key和描述,maxsplit=1确保描述含空格也能正确分割(如果有需要) key, desc = line.split(maxsplit=1) # 提取index:分割key后去掉最后两个部分 key_parts = key.split("_") index = "_".join(key_parts[:-2]) index_desc[index] = desc # 处理文件B并写入结果 with open("fileB", "r", encoding="utf-8") as f_b, open("updated_fileB", "w", encoding="utf-8") as f_out: for line in f_b: line = line.strip() if not line: f_out.write("\n") continue key, orig_desc = line.split(maxsplit=1) key_parts = key.split("_") index = "_".join(key_parts[:-2]) # 替换描述或保留原行 if index in index_desc: f_out.write(f"{key} {index_desc[index]}\n") else: f_out.write(f"{line}\n")
说明:
- 脚本先读取fileA构建映射,再逐行处理fileB,替换匹配项的描述后写入新文件。
split(maxsplit=1)可以兼容描述中包含空格的情况(如果你的场景存在这种情况)。
内容的提问来源于stack exchange,提问作者echo
相关产品推荐
相关产品推荐

