2017-03-12 48 views
0

謝謝。使用awk比較shell中的2個csv文件

我有2個csv文件,我需要對它們進行比較,如果不同則報告回來。文件格式在兩個文件中都是相同的,甚至兩個文件中的第一列數據(列A)也具有相同的內容(它是標題信息)。

嘗試使用awk命令,但有條件,不知道如何實現。

條件:

a。需要排除前兩行(因爲不需要進行比較)。可以通過這樣做來實現:

NFR=NR > 2 

b。如果任何值有差異,那麼在輸出時需要返回報頭信息及其相應的服務器名稱和值。

File1.csv:

Status Check 
APP servers 
Server name,abc,def,ghi,jkl,mno, 
Summary,,,,,, 
System Start Time,Nov/12/2016 20:12:24 GMT,Nov/12/2016 20:15:38 GMT,Nov/12/2016 20:15:37 GMT,Nov/12/2016 20:15:57 GMT,Nov/12/2016 20:11:42 GMT, 
System Life Time,118day.14hr.15min.19sec,118day.14hr.12min.01sec,118day.14hr.12min.03sec,118day.14hr.11min.44sec,118day.14hr.16min.01sec, 
OS Version,SunOS 5.10,SunOS 5.10,SunOS 5.10,SunOS 5.10,SunOS 5.10, 
Service Pack Version,Generic_147148-26,Generic_147148-26,Generic_147148-26,Generic_147148-26,Generic_147148-26, 
State,Up,Up,Up,Up,Up, 

File2.csv:

Status Check 
APP servers 
Server name,abc,def,ghi,jkl,mno, 
Summary,,,,,, 
System Start Time,Nov/13/2016 20:12:24 GMT,Nov/13/2016 20:15:38 GMT,Nov/13/2016 20:15:37 GMT,Nov/13/2016 20:15:57 GMT,Nov/13/2016 20:11:42 GMT, 
System Life Time,118day.14hr.15min.19sec,118day.14hr.12min.01sec,118day.14hr.12min.03sec,118day.14hr.11min.44sec,118day.14hr.16min.01sec, 
OS Version,SunOS 5.10,SunOS 5.10,SunOS 5.11,SunOS 5.12,SunOS 5.10, 
Service Pack Version,Generic_147148-26,Generic_147148-26,Generic_147148-26,Generic_147148-26,Generic_147148-26, 
State,Down,Up,Down,Up,Down, 

結果/輸出:

OS Version value is different for server name ghi and jkl : 5.11,5.12 
State value is different for server name abc, ghi and mno : Down,Down,Down 

是否有可能排除5/6柱進行比較,以及因爲這將與日期/時間相關,因此不需要進行比較。

只能給鍵值(比如列b/c)只有那些特定的列數據被比較的黑白文件?

+0

歡迎來到StackOverflow!你的問題的答案是「是的,這是可能的」。請查看http://stackoverflow.com/help/how-to-ask獲取有關改善此問題的提示。特別是,它需要包含用於解決問題的代碼。我們不是免費工作的短訂單程序員,我們是一個幫助彼此改進工藝的人羣。 – ghoti

+0

當然ghoti。明白了你的觀點。我忘了添加我的代碼inital post。指出前進將包括。謝謝。 – HULK

回答

2

這可能會給你一個想法如何處理這個問題你的輸出格式設置可以添加

$ paste -d, file{1,2} | 
    awk -F,  'NR<3 {next} 
       NR==3 {n=split($0,h); m=n/2} 
     NR!=5 && NR!=6 {for(i=2;i<=m-1;i++) 
         if($i!=$(i+m)) print $1,h[i],$i,$(i+m)}' 


OS Version ghi SunOS 5.10 SunOS 5.11 
OS Version jkl SunOS 5.10 SunOS 5.12 
State abc Up Down 
State ghi Up Down 
State mno Up Down 

但代碼複雜化。由於您的值包含空格,因此您可能希望保留逗號作爲輸出字段分隔符。

+0

謝謝@karakfa。我試圖運行你的代碼,但得到文件未找到錯誤。我換成了$ paste -d,實際的file1名稱,實際的file2名稱| awk -F ....我在這裏丟失了一些東西 – HULK

+0

對不起,我忘了添加打開/關閉卷曲的條紋 – HULK

+0

我怎樣才能添加逗號作爲輸出字段separtor – HULK