2017-04-10 84 views
-1

我想寫一個AWK腳本來更新一個新的csv文件的值的csv文件,以便更新現有行的詳細信息,但不存在新csv中的行保留。我認爲可以通過使用(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 ' 
     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

在awk中。閱讀所有的舊記錄在一個數組a,在打印過程中新的從adelete匹配舊的,並在END打印任何現有的舊的:

$ 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 

順序將丟失。