awk legge successivamente, in ordine da sinistra a destra, i file di input che chiudono la riga di comando
l'opzione
-F: indica a awk che il separatore tra i vari campi di ogni record sono i due punti (quello predefinito è lo spazio)
NR e FNR sono due variabili intrinseche di awk
NR registra il numero complessivo di record letti ed è sempre crescente.
FNR contiene il numero di record letti nell'inputfile corrente e viene resettato ad ogni inizio di nuovo file.
Quindi
NR==FNR è una condizione che si può verificare solo nel primo file e garantisce che sugli altri file di input non venga eseguito il blocco seguente tra graffe:
in quel blocco crea l'array associativo che ho chiamato `a', una specie di dizionario KEY:VALUE
nel tuo caso con
a[$2]=$1 KEY è il secondo campo ($2) e VALUE è il primo campo($1) del primo inputfile (il tuo file2): in questo modo hai memorizzato in awk le stringhe che ti serve confrontare col secondo inputfile;
finito di leggere il primo inputfile, per ogni record del secondo (il tuo file1) awk verifica se tra le chiavi dell'array è presente la stringa del quarto campo: lo fa con la condizione:
if ($4 in a) e in caso positivo stampa quello che ti serve: il primo campo del file1 e la stringa corrispondente che avevamo salvato nell'array
Ti suggerisco di studiare awk da esempi e facendo riferimento soprattutto a
http://www.gnu.org/software/gawk/manual/gawk.html da cui all'inizio mi ero sentito schiacciato per le dimensioni ma che consiglio perchè è scritto con chiarezza e senza presumere che il lettore abbia conoscenze iniziatiche