2017-05-22 71 views
-4

任何想法如何使用awk以下內容?使用awk如何合併兩個文件中的數據並將第二個文件中的值替換爲第一個文件?

兩個輸入文件,data.txt中和keys.txt:

data.txt中包含一些數據:

A;1 
B;2 
A;3 

keys.txt含 「鍵;值」 對( 「C」 是在這個例子不是data.txt中的一部分,但awk腳本應該仍然工作):

A;30 
B;20 
C;10 

輸出應該如下:

A;1;30 
B;2;20 
A;3;30 

因此,data.txt中包含key.txt中的任何鍵的每一行都應該獲得data.txt中的行的相應值。

+3

Stackoverflow不是一個免費的代碼寫入服務。如果你試圖寫一些東西並且遇到一些困難,那就表明你已經做了什麼並且提出一個具體的問題。 有關提示,請參閱http://stackoverflow.com/help/how-to-ask。如果你只是想完成免費工作,那麼StackOverflow不是這種請求的地方。 學習自己寫代碼或者付錢給你寫代碼。 – ghoti

+0

在這個網站上詢問並回答了一百萬次,徘徊.... –

+0

爲什麼最後的輸出不是'A; 3; 30'? – karakfa

回答

1

awk來救援!

假定第二個文件具有不同於第一檔唯一鍵(如果不是你需要指定然後會發生什麼)

$ awk 'BEGIN {FS=OFS=";"} 
     NR==FNR {a[$1]=$2; next} 
     $1 in a {print $0,a[$1]}' file2 file1 

A;1;30 
B;2;20 
A;3;30 

PS。注意文件的順序...

+0

@karafka感謝您的回覆,它不完全是我以後的輸出,我更新了原始問題,以嘗試使其更加精確。 – Markus

+0

如果你不能描述問題,尋找答案是徒勞的...... – karakfa

+0

@karafka如果keys.txt中沒有與data.txt中的某些行相匹配的鍵,那麼如何追加默認值data.txt中的那些行的值爲「1」? – Markus

1

AWK溶液:

awk -F';' 'NR==FNR{a[$1]=$2; next}{if($1 in a) $0=$0 FS a[$1]; print}' file2 file1 

輸出:

A1;1;2 
A2;2;1 
A3;3;0.5 
A1;1;2 
A2;2;1 
A3;3;0.5 

  • NR==FNR - 處理所述第一文件即file2

  • a[$1]=$2 - 每個關鍵

  • if($1 in a) $0=$0 FS a[$1]積累更多價值 - 附加價值,如果第一列匹配

+0

但是,感謝您的回覆,它不完全工作,我澄清了原來的問題。 – Markus

+0

@Markus,我在那裏看不到問題。輸出與你的問題一樣。檢查你是否沒有任何拼寫錯誤,或者你可能會混淆文件的順序 – RomanPerekhrest

+0

是的,謝謝,根據問題的輸出是正確的,但我做了一個簡約的例子。對於更大的數據(我只是用更多的數據更新了原始問題),我沒有得到awk解決方案的工作。 – Markus

相關問題