2013-12-17 9 views
0

У меня есть два текстовых файл,Отображение идентификаторов для 10 миллионов записей

Файл 1 с данными, как

счета игры Пользователь

A Rugby 2 
A Football 2 
B Volleyball 1 
C TT 2 
... 

Файлом 2

1 Basketball 
2 Football 
3 Rugby 
... 
90 TT 
91 Volleyball 
... 

Теперь то, что я хочу добавить еще один столбец в файл 2, чтобы у меня был соответствующий индекс игры из файла 2 в качестве дополнительного столбца umn в файле 1.

У меня есть 2 миллиона записей в файле 1. Поэтому я хочу добавить еще один столбец, указав индекс (в основном номер строки или порядок) игры из файла 2. Как я могу сделать это эффективно.

Сейчас я делаю это по строкам. Чтение строки из файла 1, grep соответствующую игру из файла 2 для номера строки и сохранение/запись в файл.

Это займет много времени. Как я могу ускорить это, если у меня 10 миллионов строк в файлах 2 и 3000 строк в файле 1?

+0

Есть ли причина, по которой вы не используете базу данных? –

+0

Нет, нет причин. Я имею его в виде текстового файла. – user34790

+1

Вы задали тот же вопрос раньше - http://stackoverflow.com/q/20602644/45375 - и получили ответы. Если они не работают, измените свой вопрос и/или начните награду. – mklement0

ответ

1

С , прочитайте поле 1 из File2 в массив индексируется поле 2, посмотреть массив, используя поле 2 из File1 как вы итерацию через него

awk 'NR == FNR{a[$2]=$1; next}; {print $0, a[$2]}' File2 File1 
A Rugby 2 3 
A Football 2 2 
B Volleyball 1 91 
C TT 2 90 
+0

Сколько времени это займет 10M строк? –

+0

@BenjaminGruenbaum, я не измерил его, но он, вероятно, намного быстрее, чем цикл grep OP. Основная часть, поиск массива, - 'O (1)' – iruvar

+0

@BenjaminGruenbaum Примерно немного длиннее, чем чтение каждого файла один раз, а также некоторые накладные расходы для печати матчей. Если есть только несколько матчей, не так много накладных расходов. – tripleee

0

Вы можете создать ассоциативный массив из второго файл с именами игр в качестве ключей и индексом игры в качестве значений. то для каждой строки в файле 1 поиск в массиве разыскиваемого идентификатора и записать его обратно

Associative arrays provide O(1) time complexity.

0

Используйте join команду:

$ cat file1 
A Rugby 2 
A Football 2 
B Volleyball 1 
C TT 2 

$ cat file2 
1 Basketball 
2 Football 
3 Rugby 
90 TT 
91 Volleyball 

$ join -1 3 -2 1 -o 1.1,1.2,1.3,2.2 \ 
     <(sort -k 3 file1) <(sort -k 1 file2) 

B Volleyball 1 Basketball 
A Football 2 Football 
A Rugby 2 Football 
C TT 2 Football 
0

Вот другой подход: только прочитать небольшой файл в памяти, а затем читать более крупный файл по очереди. После каждого ID был найден, выручать:

awk ' 
    NR == FNR { 
     f1[$2] = $0 
     n++ 
     next 
    } 
    ($2 in f1) { 
     print f1[$2], $1 
     delete f1[$2] 
     if (--n == 0) exit 
    } 
' file1 file2 

Перечитывая свой вопрос, я не знаю, если я ответил на вопрос: вы хотите дополнительный столбец добавляется к file1 или file2?

Смежные вопросы