$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78
Explanation:
awk implicitly loops through each file, one line at a time. Since we gave it file2 as the first argument, it is read first. file1 is read second.
FNR==NR{a[$1]=$2;next}NRis the number of lines thatawkhas read so far andFNRis the number of lines thatawkhas read so far from the current file. Thus, ifFNR==NR, we are still reading the first named file:file2. For every line infile2, we assigna[$1]=$2.nexttellsawkto skip the rest of the commands and start over with the next line.($1 in a) {print $1,a[$1],$2}If we get here, that means that we are reading the second file:
file1. If we saw the first field of the line infile2, as determined by the contents of arraya, then we print out a line with the values of field 2 from both files.