2014-01-22 39 views
1

首先加入的兩個文件與多列,我必須道歉:我知道有很多已回答我的問題不同主題,但你自己看,AWK是不是一個真正的大朋友我的。通過AWK

大家都知道這個故事吧? ;)「嗨隨機員工,你是我的選擇,我需要你學習這個我們都不知道的奇怪事情,你的最後期限是明天,祝你好運!

我不會抱怨它了(承諾:P),但多次嘗試後,我真的不能明白一切(誰說:「一件事」?)約AWK。

所以,這是我的問題!

我有兩個文件,有以下欄目:

文件A.TXT:

A B C D E F G H 

文件B.txt:

A C F I 

我想通過在另一個文件中加入這兩個文件來輸出以下內容:

輸出繼電器文件C.txt:

A B C D E F G H I 

我想使它們之間的連接,將「我」已經存在的線,列A,C和F,並移除其他的。

到目前爲止,我知道,我必須用這樣的:

awk ' 
    FNR==NR{Something ;next} 
    {print $0} 
' A.txt B.txt 

是的,我知道。聽起來很糟糕的一開始。

任何英雄,在那裏?

+0

將我們總是會考慮將A.TXT第1,第3和第6列?或者只是來自B.txt的來自A.txt的某行中有3個值的行?如果B.txt包含「A B C J」怎麼辦? –

+0

感謝您的快速回復!編輯:對不起,沒有看到你編輯你的評論。最後,我們需要每一行匹配文件B列1,2和3中的列1,3和6.爲了解釋我自己,B.txt只有4列,而A.txt有8列。 –

+0

請參閱http://stackoverflow.com/questions/5467690/how-to-merge-two-files-using-awk。似乎是非常類似的問題。 –

回答

4
awk ' 
    NR==FNR {A[$1,$3,$6] = $0; next} 
    ($1 SUBSEP $2 SUBSEP $3) in A {print A[$1,$2,$3], $4} 
' A.txt B.txt 

這需要整個文件A.txt存儲在內存中。如果B.txt是顯著小

awk ' 
    NR==FNR {B[$1,$2,$3] = $4; next} 
    ($1 SUBSEP $3 SUBSEP $6) in B {print $0, B[$1,$3,$6]} 
' B.txt A.txt 
+0

恩,謝謝!你是一個救星! :) –

+0

@ Jordan.lamarche:只是你知道:只有在第一個文件的第一遍時(FNR =讀取當前文件或標準輸入時的記錄數(或行數)),纔會有「NR == FNR」 。NR =所有文件/輸入中迄今爲止讀取的記錄(或行)總數。所以它允許glenn分開讀取第一個文件(然後創建A []數組,然後「下一步」不執行以下行),並在第二個文件中繞過第一行(因爲NR只能是> FNR),所以它會完成剩下的工作。 –