
У меня есть два файла. Файл 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.....
где OPUM04181
↔ Check1|^/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