Команда AWK, переставшая работать для большого файла

Если это предназначается как резервное копирование (я смотрю на тег), не как удаленная копия рабочего каталога, необходимо рассмотреть использование инструментов как dar или старый добрый tar. Если некоторый важный файл будет удален, и Вы не заметите его, то у Вас не будет шанса восстановить его после еженедельной синхронизации.

Второе преимущество состоит в том, что использование tar/dar позволит Вам сохранить владение файлов.

И третий - Вы сохраните пропускную способность, потому что можно сжать содержание.

1
22.01.2014, 09:14
2 ответа

Для каждой строки, где указанные поля не уникальны, Вы храните некоторые данные в памяти, которая содержит указанное поле плюс маленькие издержки. Таким образом, если у Вас нет большого количества дубликатов, или другие поля являются очень большими, неудивительно, что файл на 6.5 ГБ заставил бы больше чем 3.5 ГБ использоваться.

Если файл уже отсортирован, Вы не должны хранить все эти данные, только для сравнения смежных строк.

awk -F ',' '
    {current = $1","$2","$3","$4","$5","$13}
    previous == current {print}
    {previous = current}
'

или

sed -n -e 'x' -e 'G' -e '/^\(.*)\n\1$/ { s/\n.*//; p; }' \

Если файл не будет отсортирован, то сортировка, вероятно, будет самым быстрым способом получить информацию. Типичный sort реализации хороши с очень большими файлами.

2
27.01.2020, 23:38

Попробуйте: Вы пропустили ! до a ?

  $ awk -F',' '!a[$1,$2,$3,$4,$5,$13]++' < /var/tmp/Data.txt > unique.txt

Если ваша OS или любые команды, которые вы используете для разбора, не являются 64-битными, не скомпилированы и не предназначены для поддержки такого рода архитектуры, то у вас наверняка возникнут проблемы с обработкой 6.5Гб файлов (процесс не сможет обрабатывать требуемую память). если 32 бит : 2^32, что около 4Гб, будет лимитом (может быть еще меньше при использовании signed interger, например, лимит будет 2Гб). man largefile man largefile также может дать вам подсказку.

0
27.01.2020, 23:38

Теги

Похожие вопросы