2012-12-31 81 views
1

我如何合併兩個文件時,兩個第一列這兩個文件匹配,並與第二個文件列替換第一個文件值......我的意思是......

的數目相同列:

FILE 1: 
121212,0100,1.1,1.2, 
121212,0200,2.1,2.2, 

FILE 2: 
121212,0100,3.1,3.2,3.3, 
121212,0130,4.1,4.2,4.3, 
121212,0200,5.1,5.2,5.3, 
121212,0230,6.1,6.2,6.3, 

OUTPUT: 
121212,0100,3.1,3.2,3.3, 
121212,0200,5.1,5.2,5.3, 

換句話說,我需要打印$0第二個文件的時候比賽$1並在這兩個文件$2。我理解邏輯,但我不能使用數組來實現它。這顯然應該使用。

請花點時間來解釋任何代碼。

+0

檢查http://theunixshell.blogspot.in/2012/12/file-comparisons-using-awk-match-columns.html或這樣的:HTTP:// theunixshell。 blogspot.in/2012/12/awk-one-liner-for-multi-column.html – Vijay

回答

2

使用awk打印模式文件和管道上的第2場至grep做匹配:

$ awk 'BEGIN{OFS=FS=","}{print $1,$2}' file1 | grep -f - file2 
121212,0100,3.1,3.2,3.3, 
121212,0200,5.1,5.2,5.3, 

-f選項告訴grep採取的方式從一個文件,但使用-代替filename使grepstdin獲取模式。

所以第一awk腳本file1我們管來匹配在file2使用grep生產模式:

$ awk 'BEGIN{OFS=FS=","}{print $1,$2}' file1 
121212,0100 
121212,0200 

你可能想使用^錨比賽進行到行的開頭:

$ awk 'BEGIN{OFS=FS=","}{print "^"$1,$2}' file1 
^121212,0100 
^121212,0200 

$ awk 'BEGIN{OFS=FS=","}{print "^"$1,$2}' file1 | grep -f - file2 
121212,0100,3.1,3.2,3.3, 
121212,0200,5.1,5.2,5.3, 
+0

聰明的方法來解決這個問題。感謝所有。現在我可以去準備假期了。而且速度足夠批量處理長文件。 – nhereveri

1

以下是一種使用方法awk

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

結果:

121212,0100,3.1,3.2,3.3, 
121212,0200,5.1,5.2,5.3,