2017-03-12 49 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