AWK: просмотр файла дважды, выполнение разных задач

Я обрабатываю довольно большую коллекцию твитов, и для каждого твита я хотел бы получить упоминания о них (имена других пользователей с префиксом@), если упомянутый пользователь также находится в файле:

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"

Я уже обрабатывал файл с помощью GAWK, поэтому вместо того, чтобы снова обрабатывать его на Python или C, я решил попробовать добавить это в свой сценарий AWK. Тем не менее, я не могу найти способ пропустить один и тот же файл, выполняя разные коды для каждого. Большинство решений подразумевают вызов AWK несколько раз, но тогда я потеряю ассоциативный массив, который я создал в первом проходе.

Я мог бы сделать это очень хакерскими способами (например,catОбрабатывая файл дважды, пропуская егоsed добавить разные префиксы для всех строк в каждомcat), но я бы хотел понять этот код за пару месяцев, не ненавидя себя.

Каков будет AWK способ сделать это?

PD:

Менее страшный путь, который я нашел:

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)
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос