sort
Должен видеть все входные данные, прежде чем он может начать вывод. По этой причине sort
программа может легко предложить возможность изменить файл на месте:
sort temp.txt -o temp.txt
В частности, в документации GNUsort
говорится:
Обычно sort считывает весь ввод перед открытием файла вывода, поэтому вы можете безопасно отсортировать файл на месте, используя такие команды, как sort -o F F
и cat F | sort -o F
. Однако sort
with --merge
( -m
) может открыть выходной файл перед чтением всего ввода, поэтому такая команда cat F | sort -m -o F - G
небезопасна, так как sort может начать запись F
до cat
того, как ее прочитает.
В документации BSD sort
сказано:
Если [the] output-file является одним из входных файлов, sort копирует его во временный файл перед сортировкой и записью вывода в выходной файл [the].
Такие команды, как, uniq
могут начать запись вывода до того, как закончат чтение ввода. Эти команды обычно не поддерживают редактирование на месте (и им было бы сложнее поддерживать эту функцию).
Обычно это обходится с временным файлом, или, если вы абсолютно не хотите иметь промежуточный файл, вы можете использовать буфер для сохранения полного результата перед его записью. Например, с perl
:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Здесь часть perl считывает полный вывод из uniq
переменной, $_
а затем перезаписывает исходный файл этими данными. Вы можете сделать то же самое на любом языке сценариев по вашему выбору, возможно, даже в Bash. Но учтите, что для хранения всего файла потребуется достаточно памяти, это не рекомендуется при работе с большими файлами.