使用Awk获取两文件差异并替换字符串时遇重复输出问题求助
问题根源
原脚本以整行内容作为数组键判断差异,但SOME_VALUE、ONE_MORE在两个文件中的整行内容不同(一个是完整值,一个是缺失值),导致这两个变量的两行都被存入数组,最终重复输出。正确逻辑应该按**变量名(冒号前的部分)**区分,保留每个变量的正确值。
修正后的Awk脚本
awk ' # 处理a.yaml,存储每个变量名对应的完整正确行 NR == FNR { key = $1 sub(/:$/, "", key) # 移除变量名末尾的冒号 correct_lines[key] = $0 next } # 处理b.yaml,对比并更新数组 { key = $1 sub(/:$/, "", key) if (key in correct_lines) { # 变量已存在:行内容相同则移除(无需输出),不同则保留正确行 ($0 == correct_lines[key]) && delete correct_lines[key] } else { # 新增变量,加入数组待处理 correct_lines[key] = $0 } } END { for (key in correct_lines) { line = correct_lines[key] # 仅对大括号内容缺失的行进行替换(新增变量) if (line ~ /{{ .Data.data\. }}/) { target = tolower(substr(key, 1, length(key)-1)) sub(/{{ .Data.data\. }}/, "{{ .Data.data." target " }}", line) } print line } }' a.yaml b.yaml
脚本说明
- 存储基准值:读取
a.yaml时,以变量名为键,将完整的正确行存入数组correct_lines。 - 对比更新数组:读取
b.yaml时:- 若变量已存在:行内容与基准值一致则移除该键(无需输出);不一致则保留基准值。
- 若变量不存在:将该行加入数组,标记为新增内容。
- 替换与输出:遍历数组时,仅对大括号内容缺失的新增变量行进行替换——将变量名转小写、去掉末尾下划线,替换到大括号对应位置,最后输出所有保留的行。
测试输出
运行脚本后得到符合预期的结果:
ADD_THIS: {{ .Data.data.add_this }} SOME_VALUE: {{ .Data.data.some_value }} ONE_MORE: {{ .Data.data.one_more }}
内容的提问来源于stack exchange,提问作者Andres Cabrera
相关产品推荐
相关产品推荐

