Свързване на множество таблици по имена на редове

Бих искал да обединя няколко таблици по имена на редове. Таблиците се различават по броя на редовете и имат уникални и споделени редове, които всички трябва да се показват в изхода. Ако е възможно, бих искал да реша проблема с awk, но не се справям и с други решения.

таблица1.таб

a 5
b 5
d 9

таблица2.таб

a 1
b 2
c 8
e 11

Резултатът, който бих искал да получа следната таблица:

таблица3.таб

a 5 1
b 5 2
d 9 0
c 0 8
e 0 11

Опитах да използвам join

join table1.tab table2.tab > table3.tab

но получавам

таблица3.таб

a 5 1
b 5 2

ред c, d и e не са в изхода.


person user2715173    schedule 25.08.2013    source източник


Отговори (2)


този awk oneliner трябва да работи за вашия пример:

awk 'NR==FNR{a[$1]=$2;k[$1];next}{b[$1]=$2;k[$1]}
END{for(x in k)printf"%s %d %d\n",x,a[x],b[x]}' table1 table2

тест

kent$  head f1 f2
==> f1 <==
a 5
b 5
d 9

==> f2 <==
a 1
b 2
c 8
e 11

kent$  awk 'NR==FNR{a[$1]=$2;k[$1];next}{b[$1]=$2;k[$1]}END{for(x in k)printf"%s %d %d\n",x,a[x],b[x]}'  f1 f2
a 5 1
b 5 2
c 0 8
d 9 0
e 0 11
person Kent    schedule 25.08.2013
comment
Благодаря много за отговора! Работи много добре за решаване на даден проблем! Все още ли ще бъде приложим awk за обединяване на повече от 2 таблици по този начин? Какъв е най-добрият подход за модифициране на едноредовия ред, за да добавите допълнителни колони, получени от n (напр. 20) таблици? - person user2715173; 25.08.2013
comment
@user2715173 gawk има променлива ARGIND, полезна е за работа с много входни файлове, особено ›3 case. Бих предложил да използвате масиви от масиви, за да направите случай на n таблици. можете да намерите някои подробности тук:gnu.org/software /gawk/manual/html_node/Arrays-of-Arrays.html - person Kent; 25.08.2013

Искате да направите пълно външно присъединяване:

join -a1 -a2 -o 0 1.2 2.2 -e "0" table1.tab table2.tab

a 5 1
b 5 2
c 0 8
d 9 0
e 0 11
person Clayton Stanley    schedule 26.08.2013