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