2017-08-01 93 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.我确实假设你的文件是“分号分隔”而不是“制表符分隔”。另外,您的文件需要按键列进行排序。