【问题标题】:compare 2 csv files in shell using awk使用 awk 在 shell 中比较 2 个 csv 文件
【发布时间】:2017-03-12 12:20:56
【问题描述】:

谢谢。

我有 2 个 csv 文件,我需要对它们进行比较并报告它们是否不同。两个文件中的文件格式相同,甚至两个文件中的第一列数据(A列)具有相同的内容(它的标题信息)。

尝试使用awk命令,但有条件不知道如何实现。

条件:

一个。需要排除前 2 行(因为不需要比较)。这可以通过这样做来实现吗:

NFR=NR > 2

b.如果任何值不同,则需要在输出中报告标头信息及其各自的服务器名称以及值。

文件1.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,

文件2.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),只有那些特定的列数据被比较 b/w 文件吗?

【问题讨论】:

  • 欢迎来到 StackOverflow!您的问题的答案是“是的,有可能”。请查看stackoverflow.com/help/how-to-ask 以获取有关改进此问题的提示。特别是,它需要包含您尝试解决问题的代码。我们不是免费工作的短期程序员,我们是一个人们互相帮助改进我们的手艺的社区。​​span>
  • 当然是ghoti。明白你的意思。我忘了添加我的代码初始帖子。今后的注意事项将包括。谢谢,。

标签: shell csv awk


【解决方案1】:

这可能会让您知道如何解决问题

$ 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

可以添加您的输出格式,但会使代码复杂化。由于您的值包含空格,您可能还希望将逗号作为输出字段分隔符。

【讨论】:

  • 感谢@karakfa。我试图运行您的代码,但找不到文件错误。我替换了 $paste -d,实际文件 1 名称,实际文件 2 名称 | awk -F ....我在这里错过了什么
  • 抱歉,我忘了添加开/关花括号
  • 如何添加逗号作为输出字段分隔符
  • 改用awk -F, -v OFS=,
  • 谢谢。 OFS=,做的工作。最后一件事,我如何跳过开始时间和生命周期进行比较,因为时间值总是不同的,所以不需要比较它们。
猜你喜欢
  • 2019-05-24
  • 2012-09-05
  • 2014-10-12
  • 1970-01-01
  • 2019-09-08
  • 2019-01-19
  • 1970-01-01
  • 2018-10-23
相关资源
最近更新 更多