AWK: revisa el archivo dos veces, haciendo diferentes tareas

Estoy procesando una colección bastante grande de Tweets y me gustaría obtener, para cada tweet, sus menciones (nombres de otros usuarios, con el prefijo@), si el usuario mencionado también está en el archivo:

users = new Dictionary()
for each line in file:
   username = get_username(line)
   userid   = get_userid(line)
   users.add(key = userid, value = username)
for each line in file:
   mentioned_names = get_mentioned_names(line)
   mentioned_ids = mentioned_names.map(x => if x in users: users[x] else null)
   print "$line | $mentioned_ids"

Ya estaba procesando el archivo con GAWK, así que en lugar de procesarlo nuevamente en Python o C, decidí intentar agregar esto a mi script AWK. Sin embargo, no puedo encontrar una manera de hacer pasar el mismo archivo, ejecutando un código diferente para cada uno. La mayoría de las soluciones implican llamar a AWK varias veces, pero luego perdería la matriz asociativa que hice en el primer paso.

Podría hacerlo de maneras muy extravagantes (comocat'dos veces el archivo, pasándolosed para agregar un prefijo diferente a todas las líneas en cadacat), pero me gustaría poder entender este código en un par de meses sin odiarme.

¿Cuál sería la forma AWK de hacer esto?

PD:

La forma menos terrible que he encontrado:

function rewind(    i)
{
    # from https://www.gnu.org/software/gawk/manual/html_node/Rewind-Function.html
    # shift remaining arguments up
    for (i = ARGC; i > ARGIND; i--)
        ARGV[i] = ARGV[i-1]

    # make sure gawk knows to keep going
    ARGC++

    # make current file next to get done
    ARGV[ARGIND+1] = FILENAME

    # do it
    nextfile
}

BEGIN {
 count = 1;
}

count == 1 {
 # first pass, fills an associative array
}

count == 2 {
 # second pass, uses the array
}

FNR == 30 { 
   # handcoded length, horrible
   # could also be automated calling wc -l, passing as parameter
  if (count == 1) {
        count = 2;
        rewind(1)
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta