2012-03-02 23 views
3

私は2つのCSVファイルを用意しています。これは新しくフォーマットされたファイルと比較する必要があります。サンプルは以下の通りです。linux awkが2つのcsvファイルを比較し、フラグ付きの新しいファイルを作成する

OLDファイル

DTL,11111111,1111111111111111,11111111111,Y,N,xx,xx 
DTL,22222222,2222222222222222,22222222222,Y,Y,cc,cc 
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd 
DTL,44444444,4444444444444444,44444444444,Y,Y,ss,ss 
DTL,55555555,5555555555555555,55555555555,Y,Y,qq,qq 

NEWファイル

DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx 
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc 
DTL,44444444,4444444444444444,44444444444,Y,Y,ss,ss 
DTL,55555555,5555555555555555,55555555555,Y,Y,qq,qq 
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee 

出力ファイル

私は古いものと新しいCSVファイルを比較し、その変化を見つけたいです新しいファイルで影響を受け、FLAを更新しましたGこれらの変更

Uを示すために - 新しいファイルレコードが Dを更新した場合 - 古いファイル内の既存のレコードが新しいファイル Nに削除された場合 - 新しいファイルに既存のレコードがで利用できない場合古いファイル

サンプル出力ファイルはこれです。

DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx U 
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc U 
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd D 
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee N 

私はdiffコマンドを使用しましたが、私は望ましくないUPDATEDレコードも繰り返します。

DTL,11111111,1111111111111111,11111111111,Y,N,xx,xx 
DTL,22222222,2222222222222222,22222222222,Y,Y,cc,cc 
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd 
    --- 
DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx 
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc 
5a5 
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee 

私はこれで問題がある

awk 'NR==FNR{A[$1];next}!($1 in A)' FS=: old.csv new.csv 

だけでなく、私のレコードをフィルタするためにAWK単一行のコマンドを使用し、私にだけOLDファイルに属するレコードを取得doesntのです。

DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd 

ある は、私はこれをahieveするだけでなく駆動bashスクリプトを開始したが、良い例と多くの助けを見つけるdidntの。

myscript.awk 

BEGIN { 
     FS = "," # input field seperator 
     OFS = "," # output field seperator 
} 

NR > 1 { 
    #flag 
    # N - new record D- Deleted U - Updated 

id = $1 
    name = $2 
    flag = 'N' 

    # This prints the columns in the new order. The commas tell Awk to use the  character set in OFS 
    print id,name,flag 
} 

>> awk -f myscript.awk old.csv new.csv > formatted.csv 
+1

:http://stackoverflow.com/a/15385080/5427256 – unknown

答えて

5

これはあなたのために働くかもしれない:

diff -W999 --side-by-side OLD NEW | 
sed '/^[^\t]*\t\s*|\t\(.*\)/{s//\1 U/;b};/^\([^\t]*\)\t*\s*<$/{s//\1 D/;b};/^.*>\t\(.*\)/{s//\1 N/;b};d' 
DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx U 
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc U 
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd D 
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee N 

同じラインに沿ってawkのソリューション:

シンプル正しい方法は、ここで説明して動作します
diff -W999 --side-by-side OLD NEW | 
awk '/[|][\t]/{split($0,a,"[|][\t]");print a[2]" U"};/[\t] *<$/{split($0,a,"[\t]* *<$");print a[1]" D"};/>[\t]/{split($0,a,">[\t]");print a[2]" N"}' 
DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx U 
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc U 
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd D 
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee N 
+0

非常に貴重な返信をお寄せいただきありがとうございます.. 上記の値を使用してデータセットを使用したとき、awkソリューションは機能しましたが、次のデータセットではスクリプトは失敗しました。 – Sanath

+0

DTL、11111112,1111111111111110,11111111112、Y、N、abcdefghijklmnopqrstuvwxyz123457、abcdefghijklmnopqrstuvwxyz654322 DTL、11111113,1111111111111111,11111111113、Y、N、abcdefghijklmnopqrstuvwxyz123458、abcdefghijklmnopqrstuvwxyz654323 DTL、11111114,1111111111111112,11111111114、Y、N、abcdefghijklmnopqrstuvwxyz123459、abcdefghijklmnopqrstuvwxyz654324 DTL 、11111115,1111111111111123,1111111111111123,11111111115、Y、N、abcdefghijklmnopqrstuvwxyz123460、abcdefghijklmnopqrstuvwxyz654325 – Sanath

+0

私はそれが同じ列番号を持っていますが、望みの結果を示していないと思う>私はbashスクリプトの新しいです。このスクリプトでは 2つのデータセットの差分は、英数字のキーフィールドを表す最後の2つのデータ列のみです。 – Sanath

2

良い出発点は、おそらく次のようになります。

diff -e OLD NEW 

この出力:

それはライン5(5A)で、レコードを追加し、ライン上のレコードを変更することを意味
5a 
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee 
. 
1,3c 
DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx 
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc 

1および3(1,3c)。

この形式をそのまま使用することはできません(標準を使用するとよいでしょう)。記述した形式に変換するスクリプトを作成する必要があります。

関連する問題