2014-05-12 67 views
-1

輸入:awk中處理三個文件

File 1 
col1 col2 col3 col4 col5 col6 col7 
A  91 - E Abu 7 - 
B  82 - f Anu 9 -  
C  93 - G Aru 8 - 

File 2 
col1 col2 col3 col4 col5 col6 col7 
A  91 - x Bob 7 - 
B  82 - y Bag 9 -  
C  93 - z Bui 8 - 

File 3 
col1 col2 col3 col4 col5 col6 col7 
A  91 - T Can 7 - 
B  82 - U Con 9 -  
C  93 - V Cuu 8 -  

產出預期:

col1 col2 col3 col4 col5 
A  91 Abu Bob Can  
B  82 Anu Bag Cun   
C  93 Aru Bui Cuu 

我有具有col1和我需要打印連同所有文件的第五列相同的數據2.三個文件前兩列。 我可以使用兩個文件。所以任何人都可以幫助我處理三個或更多的文件?

+0

什麼時候打印col1和col2?如果在所有三個文件中它們是相同的或者其他條件? – Ashkan

+0

加入地圖頁面 - http://linux.die.net/man/1/join –

+0

@TomRon:'join'命令只能加入一列。雖然你當然可以使它工作,但這不是微不足道的。我想這當然取決於聯接是在一列還是兩列。我立即看到一個兩列連接(在col1和col2上,如果col6必須匹配,它可能是三列連接),但如果它只是連接的col1,那麼'join'很容易使用只要文件按照排序順序。當然,這個問題說'col1和col2'。 –

回答

2

下面是使用awk一個辦法:

$ awk ' 
BEGIN { 
    SUBSEP = FS; 
    print "col1 col2 col3 col4 col5" 
} 
FNR>1 { 
    a[$1,$2] = (a[$1,$2]?a[$1,$2]FS$5:$5) 
} 
END { 
    for(x in a) print x, a[x] 
}' file1 file2 file3 
col1 col2 col3 col4 col5 
C 93 Aru Bui Cuu 
A 91 Abu Bob Can 
B 82 Anu Bag Con 

可以通過管道輸出到sort,如果你需要的有序輸出。這不限於限制爲三個文件。它可以擴展到n個文件。只需在最後添加文件名,或者使用*來將glob填充到給定目錄下的所有文件。

+0

如果文件1中有一行'A 78 - H Aux 7 -'會發生什麼?即使在文件2或文件3中沒有匹配,鍵A/78的行也會被打印出來。 –

+0

@JonathanLeffler目前還不清楚OP是否只想排除不存在於所有文件中的打印數據。 –

1

假設所有三個文件有相同的號碼,因爲這句話

行我有三個文件在col1中具有相同的數據和2

awk 'BEGIN{OFS="\t"; 
getline<"file1";getline<"file2";getline<"file3"; 
print "col1","col2","col3","col4","col5"; 
while(1) {getline < "file1";a=$1;b=$2;c=$5;getline<"file2";d=$5;f=getline<"file3";e=$5; 
if(!f)exit;print a,b,c,d,e}}' 

輸出的:

col1 col2 col3 col4 col5 
A  91  Abu  Bob  Can 
B  82  Anu  Bag  Con 
C  93  Aru  Bui  Cuu 

這將丟棄每個文件的第一行,然後逐行讀取文件,打印d希望的領域。