2017-08-01 95 views
0

我有兩個文件(分隔所有選項卡):合併兩個表的awk

database.txt

MAR001;string1;H 
MAR002;string2;G 
MAR003;string3;H 

data.txt

data1;MAR002 
data2;MAR003 

而且我想用MAR###列,以鞏固這兩個表。預期輸出(製表符分隔):

data1;MAR002;string2;G 
data2;MAR003;string3;H 

我想使用awk;這是我的嘗試:

awk 'BEGIN{FS=OFS="\t"} FNR == NR { a[$2] = $1; next } $2 in a { print $0, a[$1] }' data.txt database.txt 

但失敗...

+1

你認爲','和'\ t'是一回事嗎? – Kent

+0

不,但我不能在這裏輸入標籤,所以我用分號 – rororo

回答

1
awk -F '\t' 'FNR==1 && NR == 1 { strt=1 } FNR==1 && NR != 1 { strt=0} strt==1 {dat[$1]=$2";"$3 } strt==0 { if (dat[$2] != "") { print $1";"$2";"dat[$2] } }' database.txt data.txt 

首先讀取database.txt並將數據讀入數組dat。然後,當我們遇到data.txt文件時,檢查dat數組中的條目,如果有數據,則打印所需的數據。

輸出:

data1;MAR002;string2;G 
data2;MAR003;string3;H 
+0

當我這樣做與我的示例輸入在這裏,它的作品,但與我的全部數據它不... ...?有關如何找出原因的任何想法? – rororo

+0

MAR文件在每個文件中都是唯一的嗎? –

+0

'data.txt'可能不是;該文件是大的,所以我不能保證 – rororo

0

所有;的第一和\t是不同的字符。如果你真正的輸入文件是製表符分隔,這裏是你的代碼的修補程序:

更改您的代碼爲:

awk '....... $1 in a { print a[$1], $0 }' data.txt database.txt 
4

我只想用join命令。這很容易:

join -t \; -1 1 -2 2 database.txt data.txt 
MAR002;string2;G;data1 
MAR003;string3;H;data2 

您可以使用-o指定輸出列順序。例如:

join -t \; -1 1 -2 2 -o 2.1,2.2,1.2,1.3 database.txt data.txt 
data1;MAR002;string2;G 
data2;MAR003;string3;H 

P.S.我確實假設你的文件是「分號分隔」而不是「製表符分隔」。另外,您的文件需要按鍵列進行排序。