Skip to main content
2 of 4
added 844 characters in body
John1024
  • 76.4k
  • 12
  • 176
  • 165
$ 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}

    NR is the number of lines that awk has read so far and FNR is the number of lines that awk has read so far from the current file. Thus, if FNR==NR, we are still reading the first named file: file2. For every line in file2, we assign a[$1]=$2.

    next tells awk to 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 in file2, as determined by the contents of array a, then we print out a line with the values of field 2 from both files.

John1024
  • 76.4k
  • 12
  • 176
  • 165