Как я выполняю какую-либо команду, редактируя ее файл (аргумент) “на месте” с помощью удара?

108
задан whoan 17 January 2015 в 16:24
поделиться

9 ответов

sort temp.txt -o temp.txt
171
ответ дан daniels 24 November 2019 в 03:29
поделиться

Если Вы настаиваете на том, чтобы использовать sort программа, необходимо использовать промежуточный файл - я не думаю sort, имеет опцию для сортировки в памяти. Любой другой прием с stdin/stdout перестанет работать, если Вы не сможете гарантировать, что размер буфера для stdin вида является достаточно большим для установки всему файлу.

Редактирование: позор мне. sort temp.txt -o temp.txt превосходные работы.

0
ответ дан whoan 24 November 2019 в 03:29
поделиться

Читайте на неинтерактивном редакторе, ex .

1
ответ дан whoan 24 November 2019 в 03:29
поделиться

Используйте аргумент --output=, или -o

Просто примерил FreeBSD:

sort temp.txt -otemp.txt
1
ответ дан whoan 24 November 2019 в 03:29
поделиться

Здесь Вы идете, одна строка:

sort temp.txt > temp.txt.sort && mv temp.txt.sort temp.txt

Технически нет никакого копирования во временный файл, и команда 'mv' должна быть мгновенной.

6
ответ дан davr 24 November 2019 в 03:29
поделиться

Многие упомянули опция-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.
3
ответ дан epatel 24 November 2019 в 03:29
поделиться

Это было бы высоко ограниченной памятью, но Вы могли использовать awk, чтобы хранить промежуточные данные в памяти и затем записать ее обратно.

uniq temp.txt | awk '{line[i++] = $0}END{for(j=0;j<i;j++){print line[j]}}' > temp.txt
3
ответ дан JayG 24 November 2019 в 03:29
поделиться

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. Но обратите внимание, что будет требоваться достаточно памяти, чтобы хранить весь файл, это не желательно при работе с большими файлами.

29
ответ дан Bruno De Fraine 24 November 2019 в 03:29
поделиться

Чтобы добавить возможность uniq , каковы недостатки:

sort inputfile | uniq | sort -o inputfile
1
ответ дан 24 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

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