2015-10-05 92 views
0

我有兩個文件,其具有組件的名稱和版本號由空格分隔:Unix文件比較

cat file1 
com.acc.invm:FNS_PROD 94.0.5 
com.acc.invm:FNS_TEST_DCCC_Mangment 94.1.6 
com.acc.invm:FNS_APIPlat_BDMap 100.0.9 
com.acc.invm:SendEmail 29.6.113 
com.acc.invm:SendSms 12.23.65 

cat file2 
com.acc.invm:FNS_PROD 94.0.5 
com.acc.invm:FNS_TEST_DCCC_Mangment 94.0.6 
com.acc.invm:FNS_APIPlat_BDMap 100.0.10 
com.acc.invm:SendEmail 29.60.113 
com.acc.invm:SendSms 133.28.65 
com.acc.invm:distri_cob 110 

所需輸出是:所有組分從具有一個更高的版本比在文件1文件2。

如果不在file1中,我們必須忽略file2中的組件,以及file1中具有相同版本和更低版本的組件。

在這個例子中所需要的輸出是

com.acc.invm:FNS_APIPlat_BDMap 100.0.10 
com.acc.invm:SendEmail 29.60.113 
com.acc.invm:SendSms 133.28.65 

希望如此,我跟我的要求明確。

+0

任何幫助,將不勝感激 – rKSH

回答

0
$ cat tst.awk 
{ split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] } 
NR==FNR { prev[$1] = curr; next } 
!($1 in prev) || (curr > prev[$1]) 

$ awk -f tst.awk file2 file1 
com.acc.invm:FNS_TEST_DCCC_Mangment 94.1.6 
com.acc.invm:SendEmail 29.6.113 
com.acc.invm:SendSms 12.23.65 
+0

它的「tst.awk」文件是如何製作的? – rKSH

+0

使用您選擇的文本編輯器,就像任何其他文件一樣。 vi,emacs,pico,無論什麼......你是如何創建你的文件的? –

+1

謝謝埃德莫頓:) – rKSH

1

這裏有一個簡單的解決方案,這是「幾乎沒有」:

join -a1 file1 file2 | awk '$2 > $3 {print $1,$2}' 

它產生:

com.acc.invm:FNS_TEST_DCCC_Mangment 94.1.6 
com.acc.invm:FNS_APIPlat_BDMap 100.0.9 
com.acc.invm:SendEmail 29.6.113 
com.acc.invm:SendSms 12.23.65 

注意,BDMap進入生產,因爲awk不知道如何分析你的版本數字,所以他們進行文字比較。如果你可以使用固定號碼的數字,如100.000.009,這可以解決它,但我想你不想這樣做,所以我們需要在上面多一點工作。

+0

謝謝約翰,但我的要求是,它應該也取決於版本也。 file1中的所有組件的版本高於file2中的所有組件。 file1中不在file2中的所有組件。 BDMap不應該在o/p中,因爲它在file1中的版本較低(100.0.9),比較file2。 – rKSH

+0

@ RakeshSinghTomar:是的,如果你看了我寫的內容,你可以看到我完全討論了這些問題。你應該將你已有的版本標記代碼集成到我的awk程序中,然後它應該是完整的。我的回答的主要觀點是,在'awk'之前'join'可以更輕鬆地完成大部分工作。 –