linux - 准确比较两个文本

标签 linux awk diff redhat

<分区>

亲爱的 friend

现在我正在寻找一个终端来准确比较两个文本。

请先检查以下详细信息

第一段文字

111  222  name1
111  555  sea1

第二条文字

777  888  blue1
111  666  name1

最终结果

Updated:"111 666 name1" 

New Added:"777 888 blue1" 

New Deleted:"111 555 sea1"

首先,我们应该比较两个文本的第3列。你会发现两个文本中的“name1”是相同的。

基于此,我们开始比较“name1”行的第1列和第2列,找出不同之处。但是,第1列和第2列应该作为一个部分来比较,而不是两个部分

如果第二个文本存在差异,则打印最终结果

Updated:"111 666 name1" 

其次,如果第3列的名称只存在于第2个文本中,则打印最终结果

New Added:"777 888 blue1"

第三,如果第3列的名称只存在于第1个文本中,请打印最终结果

New Deleted:"111 555 sea1"

如果可能,请给我更多关于这方面的指导

非常感谢

最佳答案

让你开始。将程序保存到diff.awk

# Usage:
# awk -f diff.awk old.txt new.txt 

function trim(s) { # remove trailing spaces
    sub("[[:space:]]+$", "", s)
    return s
}

function decode() { # sets `key', `val', and `all'
    all = $0
    key = $3; $3 = ""
    val = trim($0)
}

FNR != NR {
    file = 1
}

file == 0 { # old file
    decode()

    keys[n++] = key
    vals[key] = val
    alls[key] = all
}

file == 1 { # new file
    decode()

    if (!(key in vals))
        printf "New Added:\"%s\"\n", all
    else if (all != alls[key]) {
        printf "Updated:\"%s\"\n", all
        delete vals[key] # seen this key in new file
    }
}

END {
    for (i=0; i<n; i++) {
        key = keys[i]
        if (key in vals)
           printf "New Deleted:\"%s\"\n", alls[key]
    }
}

关于linux - 准确比较两个文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181399/

相关文章:

Linux : How to set up "global" user/passwords/groups file in svn

linux - 旧的 ARM32 二进制文件可以在 AARCH64 内核上运行吗?

linux - 如何使用 linux expect 脚本输入密码提示

awk 中的字符串比较

bash - grep 部分出现在一个文件中的行到另一个文件

c# - 任何现有的 C# 代码 (OSS) 将计算两个字符串之间的差异并输出 html?

eclipse - 如何在 Eclipse 比较窗口中切换文件的顺序(原始和修改)?

linux - Iptables 通过 VPN 转发

bash - awk 中 shell 变量的用法

android-studio - 我想比较 Android studio 中的两个项目