准确比较两个文本

时间:2015-10-17 00:28:03

标签: linux awk diff redhat

亲爱的朋友

现在我找到一个能准确比较两个文本的终端。

请先查看以下详细信息

第一个文字

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"

如果可能的话,请给我更多关于此的指导

非常感谢

1 个答案:

答案 0 :(得分:1)

让你入门。将程序保存到 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]
    }
}