2017-03-12 12 views
0

ありがとうございます。awkを使ってシェルの2つのcsvファイルを比較してください

私は2つのcsvファイルを用意していますが、それらを比較して、それが違う場合に報告する必要があります。ファイル形式は両方のファイルで同じであり、両方のファイルの最初の列データ(列A)でも同じ内容(ヘッダー情報)を持ちます。

awkコマンドを試しましたが、実装方法が不明な条件があります。

条件:

a。最初の2行を除外する必要があります(比較には必要ないため)。これを行うことでこれを達成することができます:

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に追加するのを忘れていました。前向きに指摘されている点には、感謝祭が含まれます。ありがとう@karakfa。 – 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

あなたのコードを実行しようとしましたが、ファイルが見つかりませんでした。私は$ paste -d、実際のfile1の名前、実際のfile2の名前を置き換えました。 awk -F ....ここに何かがありません – HULK

+0

申し訳ありませんが、私は開いた/閉じる中かっこを追加するのを忘れました – HULK

+0

出力フィールドsepartorとしてカンマを追加するには – HULK

関連する問題