$ 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.
a[$1]=$2Here,
ais an associative array anda[$1]=$2means saving file2's second column while indexed based on the, denoted$2, as a value in arrayausing file2's first column, (of file2)$1, as the key.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.