Intereting Posts
OpenWRT на встроенном устройстве в качестве брандмауэра Установка USB-накопителя, который не распознается перемещение (файл | каталог), избегая конфликтов имен файлов условный DirectoryIndex на основе IP-адреса, используя .htaccess Как я могу заставить irssi-proxy отправлять мне пропущенные упоминания, когда я подключаюсь? Как передать аргумент скрипту, который вводится в bash Проблема с использованием команды grep с переменной env, содержащей специальные символы Сценарий оболочки для захвата имени и размера файла в файле csv и добавления заголовка в этот файл mailx между RHEL 5 и RHEL 6 Резервные порты для модема Можно ли настроить приложения для использования разных сетевых интерфейсов по-разному? Если да, то как? pulseaudio вдруг перестала работать? Как сигнализировать о конце ввода stdin Посетители, посетившие / стр. 1, а также / стр. 2 Отключить тачпад в скрипте инициализации

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

У меня два файла:

A.txt – около 90 ГБ
B.txt – около 80 ГБ

Я хочу объединить два файла и удалить дублированные строки.

Как мне это сделать?

Если команды, отличные от awk , лучше подходят для этой работы, пожалуйста, дайте мне знать.

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

Если входные файлы уже отсортированы, вы можете сделать следующее:

 sort -mu A.txt B.txt > C.txt 

Возможно, вам придется изменить языковой стандарт на тот, который имеет тот же порядок сортировки, который использовался для сортировки файлов.

Это не требует хранения более одной строки каждого файла в памяти за раз.

Если они не были отсортированы, удалите -m , установите $TMPDIR в каталог в файловой системе (желательно быстро) с 170 ГБ свободного места и будьте готовы немного подождать.

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

sort будет использовать временные файлы, так что может работать даже с системой с небольшой памятью. Но чем больше у вас памяти, тем лучше. С помощью sort GNU см. Также параметры --compress-program и --buffer-size , которые могут помочь вам настроить лучшую производительность. Если используемый порядок сортировки не имеет значения для вас, установите локаль на CLC_ALL=C sort... ), поскольку это будет наиболее эффективным.

Попробуйте эту команду:

 cat A.txt B.txt | awk '!seen[$0]++' > C.txt 

Это может занять некоторое время с такими тяжелыми файлами …

 printf ""> MergeFile
 cat A.txt B.txt | 
 в то время как IFS = read -r line;  делать 
   если [ !  -z "$ line"];  тогда
     если !  grep -Fxqe "$ line" MergFile;  тогда
       echo "$ line" >> MergeFile;
     фи
   фи
 сделанный

объяснение

Создайте новый MergeFile с
printf "">MergeFile # или необязательно: touch MergeFile

Соедините два файла с циклом while:
cat A.txt B.txt |

Прочитайте каждую строку:
while IFS= read -r line; do

Обрабатывать пустые строки:
if [ ! -z "$line" ]; then
* если вы хотите сохранить первую пустую строку, добавьте ее в позицию else

Пустые результаты означают, что он впервые попадает в MergeFile (т. Е. Он уникален):
if ! grep -Fxqe "$line" MergFile; then

Добавьте его в MergeFile:
echo "$line">>MergeFile;