Объединить несколько текстовых файлов и удалить дубликаты

У меня около 350 текстовых файлов (и каждый файл составляет около 75 МБ). Я пытаюсь объединить все файлы и удалить повторяющиеся записи. Файл находится в следующем формате:

ip1,dns1
ip2,dns2
...

Я написал небольшую оболочку script, чтобы сделать это

#!/bin/bash
for file in data/*
do
    cat "$file" >> dnsFull
done
sort dnsFull > dnsSorted
uniq dnsSorted dnsOut
rm dnsFull dnsSorted

Я часто обрабатываю эту обработку и задаюсь вопросом, есть ли что-нибудь, что я мог бы сделать, чтобы улучшить обработку в следующий раз, когда я запустил ее. Я открыт для любого языка программирования и предложений. Спасибо!

Ответ 1

Во-первых, вы не используете полную мощность cat. Цикл можно заменить просто

cat data/* > dnsFull

предполагая, что файл изначально пуст.

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

cat data/* | sort | uniq > dnsOut

Это все еще расточительно, так как sort может использовать то, что вы используете cat и uniq for; весь script можно заменить на

sort -u data/* > dnsOut

Если это еще не достаточно быстро, тогда поймите, что сортировка занимает время O (n lg n), в то время как дедупликация может выполняться в линейном времени с помощью Awk:

awk '{if (!a[$0]++) print}' data/* > dnsOut