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