2015-10-17 112 views
0

親愛的朋友準確比較兩個文本

現在我正在查找一個終端來準確比較兩個文本。

請檢查下面的詳細信息

第一個文本

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" 

首先,我們應該比較兩個文本的第三列。你可以發現兩個文本中的「name1」是相同的。

在此基礎上,我們開始比較第1列和「名1」行找到different.But,第1和第2列的第2列應作爲一個部分來比較,而不是兩個部分

如果存在不同在第二個文本,它會打印出最終結果

Updated:"111 666 name1" 

其次,如果第三列只在2RD文本exsit的名字,它會打印出最終結果

New Added:"777 888 blue1" 

第三,如果第三列的名稱只在第1文本存在,請打印最終結果

New Deleted:"111 555 sea1" 

如果可能的話,請給我更多的導向管這個

謝謝你這麼多

+0

分享你的研究可以幫助每個人。告訴我們你試過了什麼,以及它爲什麼不符合你的需求。這表明你已經花時間去嘗試幫助自己,它使我們避免重申明顯的答案,最重要的是它可以幫助你得到更具體和相關的答案! –

+0

你知道標準工具'diff file1 file2'嗎?它產生類似的,但較少的詳細輸出。祝你好運。 – shellter

+0

對我來說,最大的障礙是如果我們想要達到這個目標,應該結合diff和awk,或者其他。但是我有很長時間的測試和研究。最終結果不是很滿意 – Andy

回答

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] 
    } 
} 
+0

你好,親愛的裂縫女士,那是如此的重要,非常感謝你。我也在學習關於AWK的知識,它非常強大。 – Andy