2017-04-10 17 views
-1

新しいcsvファイルの値を使用してcsvファイルを更新するAWKスクリプトを作成しようとしています。これは、既存の行は更新されますが、 。私はそれが(NR == FNR)で指数を作ることによって行うことができると思いますが、私はまだ何かを手に入れることはできませんでした。AWKを使用してCSVファイルを更新

old.csv 
Name Size Date 
================== 
A  20mb 1/10 
B  10mb 1/10 


new.csv 
Name Size Date 
================== 
A  24mb 2/10 
C  30mb 2/10 

(おそらくいくつかのスクリプト、AWK?)

output.csv 
Name Size Date 
================== 
A  24mb 2/10 
B  10mb 1/10 
C  30mb 2/10 

これを達成するための方法上の任意のアイデアを:ここでは動作するようになっているのですか?おそらくAWK以外のものを使用しますが、それは、最小限のAIXの設定で動作するように

おかげ

+0

fyi:csvはカンマ区切りの値を意味します – Sundeep

+0

私は知ってお礼します。 –

+0

の読みやすさのために、テキスト処理では、 Fはawkに応じて設定する必要があります – Sundeep

答えて

2
$ cat old 
Name Size Date 
================== 
A  20mb 1/10 
B  10mb 1/10 

$ cat new 
Name Size Date 
================== 
A  24mb 2/10 
C  30mb 2/10 

$ awk 'FNR<3{if(FNR==NR)print;next}{a[$1]=$0}END{for(i in a)print a[i]}' old new 
Name Size Date 
================== 
A  24mb 2/10 
B  10mb 1/10 
C  30mb 2/10 

説明はawkで

awk ' 
     FNR<3{        # this is for skipping first 2 lines 
       if(FNR==NR)print;    # FNR==NR is true only when awk reads first file 
       next       # go to next line 
     } 
     {    
       a[$1]=$0      # array a where index being first field and value being current record/line/row 
     } 
     END{         # end block we print array a contents 
       for(i in a)print a[i] 
     } 
     ' old new 
+1

ありがとう、これは完璧に働いた –

1

を持っていることができます。 deleteマッチング古い既存の古いものaからとEND印刷で新しいものを印刷しながら、配列a内のすべての古いレコードを読む:

$ awk 'NR==FNR{a[$1]=$0;next}{print $0;delete a[$1]}END{for(i in a) print a[i]}' old new 
Name Size Date 
================== 
A  24mb 2/10 
C  30mb 2/10 
B  10mb 1/10 

注文が失われます。

関連する問題