请求使用AWK或sed实现file2与file1的fileID匹配替换及行处理
用AWK实现大文件的匹配替换需求
针对你提出的文件修改需求,这里提供一个基于AWK的高效实现方案,完全满足你的要求,同时也给出简化版本供选择。
完整实现(包含注释原行+替换fileID)
这个命令会先从file1中提取name与fileID的对应关系,再遍历file2完成匹配、注释和替换操作:
awk ' # 处理第一个文件file1,构建name到fileID的映射表 NR == FNR { # 提取name后的带引号字符串作为键 if (match($0, /name "([^"]+)"/, name_arr)) { target_name = name_arr[1] # 找到fileID对应的字段值 for (i = 1; i <= NF; i++) { if ($i == "fileID") { id_map[target_name] = $(i+1) break } } } next } # 处理第二个文件file2 { # 检查当前行是否包含目标name字段 if (match($0, /name "([^"]+)"/, name_arr)) { current_name = name_arr[1] # 如果在映射表中存在对应关系 if (current_name in id_map) { # 输出注释后的原行 print "#commentText: " $0 # 替换fileID的值 for (i = 1; i <= NF; i++) { if ($i == "fileID") { $(i+1) = id_map[current_name] break } } # 输出修改后的行 print $0 next } } # 不匹配的行直接原样输出 print $0 } ' file1 file2 > modified_file2
关键逻辑说明
NR == FNR:AWK内置变量,仅在处理第一个输入文件(file1)时触发这段代码,用于构建映射关系match()函数:通过正则表达式精准提取name后的带引号字符串,避免空格干扰- 遍历字段定位
fileID:确保准确找到需要替换的位置,适配不同字段顺序(只要fileID和对应值相邻即可)
简化版本(仅替换fileID,省略注释步骤)
如果不需要保留原行的注释,可使用这个更简洁的命令:
awk ' NR == FNR { if (match($0, /name "([^"]+)"/, name_arr)) { for (i = 1; i <= NF; i++) { if ($i == "fileID") { id_map[name_arr[1]] = $(i+1) break } } } next } { if (match($0, /name "([^"]+)"/, name_arr) && name_arr[1] in id_map) { for (i = 1; i <= NF; i++) { if ($i == "fileID") { $(i+1) = id_map[name_arr[1]] break } } } print $0 } ' file1 file2 > simplified_modified_file2
处理后的预期结果
执行完整实现命令后,file2会被修改为你预期的格式:
dummyline0 #commentText: somestring1 fileID AAA name "key string 1" first 1 begin somestring1 fileID 1234 name "key string 1" first 1 begin dummyline1 #commentText: somestring2 fileID BBBBB name "other key string" middle 1 continue somestring2 fileID 567 name "other key string" middle 1 continue dummyline2 dummyline3 #commentText: somestring2 fileID CCCCCC name "last key string" final 1 end somestring2 fileID 890 name "last key string" final 1 end
内容的提问来源于stack exchange,提问作者sameucho
相关产品推荐
相关产品推荐

