Самый быстрый способ поиска и замены в большом файле при замене поля, присутствующего в другом файле

Самый быстрый способ поиска и замены в большом файле при замене поля, присутствующего в другом файле

У меня есть два файла. Файл 1 — это csv с 60 полями:

111,Check1|^/h1/h2/h3,22062014184500,20,0.....
111,Check2|^/h43/h40/h9,22062014184500,4,.....
111,Check3|^/h1/h3/h4,22062014184500,0,0,.....

File2 — это файл сопоставления:

OPUM04181,Check1|^/h1/h2/h3
OPUM04040235,Check3|^/h1/h3/h4
OPUM04051898,Check2|^/h43/h40/h9 

Теперь мне нужно в поле 2 файла 1 заменить поле на поле 1 файла 1, соответствующее полю 2. Пример:

Теперь мне нужно заменить поле 2 файла file1 полем 1 строки в file2, соответствующей полю 2. Пример:

В файле1:

111,Check1|^/h1/h2/h3,22062014184500,20,0.....

будет

111,OPUM04181,22062014184500,20,0..... 

где OPUM04181Check1|^/h1/h2/h3отображается в файле file2.

Мое ограничение в том, что File1 и file2 не имеют одинаковый набор значений; их количество отличается. Кроме того, количество строк составляет 3 миллиона для обоих файлов.

Вот что я пытался сделать:

  • Я запустил цикл, взяв поле 2 в файле 1
  • Я проверял, присутствует ли это поле в file2.
  • Если присутствует, я взял поле 1 в файле 2.
  • Я заменял field2 в file1 с помощью sed s///g. Но это занимает огромное количество времени.

Также я не могу отсортировать File1.

Какой метод более быстрый?

решение1

awk -F, -v OFS=, '
    NR==FNR {opu[$2]=$1; next} 
    $2 in opu {$2 = opu[$2]; print}
' file2 file1

Это считывает файл «сопоставления» в память, а затем заменяет 2-е поле для file1. Каждый файл обрабатывается ровно один раз.

Вывод идет на stdout, поэтому для замены файла «на месте» выполните:

awk ... file2 file1 > tempfile && mv tempfile file1

Связанный контент