Matching 2 files

Hi,

I am able to modify files (one file) but I have a hard time working with multiple files simultaneously.

So I have two files. Basically I want to match two files based on certain columns. Both files are tab-seperated.

File1 looks something like this:

num1  89  george
num4  78  bob

File 2 is a much larger file and looks somethign liek this:

num1  3    lion
num1  13  tiger
num1  84  bear
num4  3    house
num4  19  dog
num4  77  mouse

So what I want to do is match column 1 from Files1 and 2. I also want to substract column 2 from both files. So if they are a match, I want to print (into a seperate file) the row with the smallest difference for column 2.

So for my example above, the output file would look like this

num1 5 george bear
num4 1 bob mouse

thanks

What have you tried so far?

See if this helps.

while read value1
do
a=`echo $value1 | cut -d ' ' -f1`
b=`echo $value1 | cut -d ' ' -f2`
c=`echo $value1 | cut -d ' ' -f3`
while read value2
do
a1=`echo $value2 | cut -d ' ' -f1`
b1=`echo $value2 | cut -d ' ' -f2`
c1=`echo $value2 | cut -d ' ' -f3`
if [ "$a" = "$a1" ]
then
b2=`expr $b - $b1`
echo $a $b2 $c $c1 >>outfile
fi
done<file2
done <file1
sort -o outfile2 -2 outfile
while read out1
do
x=`echo $out1 | cut -d ' ' -f1`
grep $x outfile2 | head -1 >>finalout
grep -v $x outfile2 >tmp
mv tmp outfile2
done<outfile2

Try this...

while read value1
do
        a=`echo $value1 | cut -d ' ' -f1`
        b=`echo $value1 | cut -d ' ' -f2`
        c=`echo $value1 | cut -d ' ' -f3`
        x=`grep "$a" file2|sort -nr -k2,2|head -1|cut -d' ' -f1`
        y=`grep "$a" file2|sort -nr -k2,2|head -1|cut -d' ' -f2`
        z=`grep "$a" file2|sort -nr -k2,2|head -1|cut -d' ' -f3`
        Diff=`expr $b - $y`
        echo "$a $Diff $c $z" >>outfile
done <file1

Note:
file1 - your first file
file2 - your second file
outfile - the result file

I had the solution ready, but wanted you to give it a try...

find_corresponding_least_val()
{
   cat file2 | grep "$_key" | awk '{
      if((val-$2) < _diff) {
         _diff=val-$2; args=$3
      }
      else
         _diff=val-$2
   }
      END {
         printf("%s\t%s\t%s\n", key, _diff, args)
   }' key="$_key" val="$_val"
}

while read line
do
   _key=`echo $line | awk '{print $1}`
   _val=`echo $line | awk '{print $2}`
   _args=`echo $line | awk '{print $3}`
   find_corresponding_least_val $_key $_val
done < file1