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

使用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
脚本说明
  1. 存储基准值:读取a.yaml时,以变量名为键,将完整的正确行存入数组correct_lines。
  2. 对比更新数组:读取b.yaml时:
    • 若变量已存在:行内容与基准值一致则移除该键(无需输出);不一致则保留基准值。
    • 若变量不存在:将该行加入数组,标记为新增内容。
  3. 替换与输出:遍历数组时,仅对大括号内容缺失的新增变量行进行替换——将变量名转小写、去掉末尾下划线,替换到大括号对应位置,最后输出所有保留的行。
测试输出

运行脚本后得到符合预期的结果:

ADD_THIS: {{ .Data.data.add_this }}
SOME_VALUE: {{ .Data.data.some_value }}
ONE_MORE: {{ .Data.data.one_more }}

内容的提问来源于stack exchange,提问作者Andres Cabrera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:50:49