2013-11-09 36 views
0

我有以下文件,
比較兩個文件和合並數據

total.txt

order1,5,item1
order2,6,item2
order3,7,item3
order4,6,item4
order8,9,item8

changed.txt

order3,8,item3
order8,12,item8

total.txt是總單數據和changed.txt近來更改的數據。我想合併總最近的變化,我想輸出,

Output.txt的

order1,5,item1
order2,6,item2
order3,8,item3
order4,6,item4
order8,12,item8

注:第2 (第3行&第5行)的行l.txt更新爲changed.txt文件

我已經使用下面的nawk來比較第一個coulmn,但不能將它打印到輸出文件。請完成下面的命令幫助

nawk -F"," 'NR==FNR {a[$1]=$2;next} ($1 in a) "print??"' total.txt changed.txt

回答

0

閱讀第一changed.txt文件,並在哈希保存數據。然後比較,如果在它存在的total.txt第一場和替換值:

awk ' 
    BEGIN { FS = OFS = "," } 
    NR == FNR { a[$1] = $2; next } 
    { if ($1 in a) { $2 = a[$1] } print } 
' changed.txt total.txt 

它產生:

order1,5,item1 
order2,6,item2 
order3,8,item3 
order4,6,item4 
order8,12,item8 
3

另一個awk

awk -F, 'FNR==NR {a[$1]=$0;next} {print (a[$1]?a[$1]:$0)}' changed.txt total.txt 
order1,5,item1 
order2,6,item2 
order3,8,item3 
order4,6,item4 
order8,12,item8 

它是如何工作的?

awk -F, '      # set field separator to "," 
    FNR==NR {     # run this only on first file "changed.txt" 
     a[$1]=$0    # store "changed.txt" in array "a" using first field as index 
     next     # skip to next record 
    } 
     {      # run this when second file is read "total.txt" 
     print (a[$1]?a[$1]:$0) # if filed exist in "changed" use that, else use "total" 
    }' changed.txt total.txt # read these files 
+0

+1你的,貼我的回答後,我發現我有與你同樣的想法。你給瞭解釋。 – Kent

1

爲您做這一行工作嗎?

awk -F, 'NR==FNR{a[$1]=$0;next}a[$1]{$0=a[$1]}7' change total 

測試:

kent$ head c t 
==> c <== 
order3,8,item3 
order8,12,item8 

==> t <== 
order1,5,item1 
order2,6,item2 
order3,7,item3 
order4,6,item4 
order8,9,item8 

kent$ awk -F, 'NR==FNR{a[$1]=$0;next}a[$1]{$0=a[$1]}7' c t 
order1,5,item1 
order2,6,item2 
order3,8,item3 
order4,6,item4 
order8,12,item8 
2

這可能會爲你工作(GNU SED):

sed -r 's/^([^,]*,).*/s|^\1.*|&|/' changed.txt | sed -f - total.txt > output.txt