Если Вы настаиваете на том, чтобы использовать sort
программа, необходимо использовать промежуточный файл - я не думаю sort
, имеет опцию для сортировки в памяти. Любой другой прием с stdin/stdout перестанет работать, если Вы не сможете гарантировать, что размер буфера для stdin вида является достаточно большим для установки всему файлу.
Редактирование: позор мне. sort temp.txt -o temp.txt
превосходные работы.
Используйте аргумент --output=
, или -o
Просто примерил FreeBSD:
sort temp.txt -otemp.txt
Здесь Вы идете, одна строка:
sort temp.txt > temp.txt.sort && mv temp.txt.sort temp.txt
Технически нет никакого копирования во временный файл, и команда 'mv' должна быть мгновенной.
Многие упомянули опция-o . Вот часть страницы справочника.
Из страницы справочника:
-o output-file
Write output to output-file instead of to the standard output.
If output-file is one of the input files, sort copies it to a
temporary file before sorting and writing the output to output-
file.
Это было бы высоко ограниченной памятью, но Вы могли использовать awk, чтобы хранить промежуточные данные в памяти и затем записать ее обратно.
uniq temp.txt | awk '{line[i++] = $0}END{for(j=0;j<i;j++){print line[j]}}' > temp.txt
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
говорит:
Если выходной файл является одним из входных файлов, вид копирует его во временный файл прежде, чем отсортировать и записать вывод в выходной файл.
Команды такой как uniq
может начать писать вывод, прежде чем они закончат читать вход. Эти команды обычно не поддерживают оперативное редактирование (и им было бы более трудно поддерживать эту функцию).
Вы обычно работаете вокруг этого с временным файлом, или если Вы абсолютно не хотите иметь промежуточный файл, Вы могли бы использовать буфер для хранения полного результата перед выписыванием его. Например, с perl
:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Здесь, часть жемчуга читает полный вывод из uniq
в переменной $_
и затем перезаписывает исходный файл с этими данными. Вы могли сделать то же в языке сценариев по Вашему выбору, возможно, даже в Bash. Но обратите внимание, что будет требоваться достаточно памяти, чтобы хранить весь файл, это не желательно при работе с большими файлами.
Чтобы добавить возможность uniq
, каковы недостатки:
sort inputfile | uniq | sort -o inputfile