sortДолжен видеть все входные данные, прежде чем он может начать вывод. По этой причине sortпрограмма может легко предложить возможность изменить файл на месте:
sort temp.txt -o temp.txt
В частности, в документации GNUsort говорится:
Обычно sort считывает весь ввод перед открытием файла вывода, поэтому вы можете безопасно отсортировать файл на месте, используя такие команды, как sort -o F Fи cat F | sort -o F. Однако sortwith --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. Но учтите, что для хранения всего файла потребуется достаточно памяти, это не рекомендуется при работе с большими файлами.