If you want a "pure BASH" solution, I don't have one off hand. Stuff like what you mentioned, I generally use a data base for. In this particular, I'd use SQLite. A shell script using sqlite3 & awk would look something like:
#!/bin/sh
rm files.db3
{
cat <<EOF
.mode column
.headers on
create table file1 (name text, weight int, height int);
create table file2 (name text, weight int, height int);
EOF
awk 'NR > 1 {print "INSERT INTO file1 VALUES(\"" $1 "\"," $2 "," $3 ");"} ' file1.txt
awk 'NR > 1 {print "INSERT INTO file2 VALUES(\"" $1 "\"," $2 "," $3 ");"} ' file2.txt
cat <<EOF2
.print Lines in file1 which have names not in file2
select * from file1 where name not in (select name from file2);
.print
.print Lines in file2 which have names not in file1
select * from file2 where name not in (select name from file1);
.print
.print Statistics on common names.
select
f1.name, f1.weight as weight1, f1.height as height1, f2.weight as weight2, f2.height as height, f1.weight - f2.weight as w_diff, f1.height - f2.height as h_diff
from file1 as f1
join file2 as f2
EOF2
} | sqlite3 files.db3
The files look like (columns separated by tabs, not spaces!)
[tsh009@it-johnmckown-linux Val]$ cat file1.txt
Name weight1 height1
Alex 220 67
Tom 320 75
Craig 180 71
John 186 65
[tsh009@it-johnmckown-linux Val]$ cat file2.txt
Name weight2 height2
Alex 226 69
Tom 320 75
Craig 170 70
Steve 420 80
It if were much more complicated, I'd use an R script. I'm way too lazy to try this in plain BASH, using only BASH facilities. I might think about it in ooRexx.