it-swarm.com.ru

Как отсортировать файл на месте

Когда мы используем команду sort file, Файл показывает свое содержимое отсортированным способом, что если я не хочу получать какой-либо вывод, кроме отсортированного файла?

137
Ali Sajid

Вы можете использовать перенаправление файлов для перенаправления отсортированного вывода:

sort input-file > output_file

Или вы можете использовать параметр сортировки -o, --output=FILE, чтобы указать один и тот же файл ввода и вывода:

sort -o file file

Примечание: Распространенной ошибкой является попытка перенаправить вывод в один и тот же входной файл (Например, sort file > file). Это не работает, так как оболочка выполняет перенаправления (не программа sort (1)), а входной файл (как и вывод) также будет удален непосредственно перед передачей sort (1) Запрограммируйте возможность чтения.

284
Sylvain Bugat

Команда sort по умолчанию выводит результат операции сортировки в стандартный вывод. Чтобы добиться сортировки по месту, вы можете сделать это:

sort -o file file

Это перезаписывает ввод file отсортированным выводом. Переключатель -o, используемый для указания вывода, определяется POSIX , поэтому должен быть доступен во всех версиях sort:

-o Укажите имя выходного файла, который будет использоваться вместо стандартного вывода. Этот файл может совпадать с одним из входных файлов.

Если вам не повезло иметь версию sort без ключа -o ( Луис уверяет меня, что они существуют), вы можете добиться редактирования на месте стандартным способом:

sort file > tmp && mv tmp file
41
Tom Fenech

Чтобы отсортировать файл на месте, попробуйте:

echo "$(sort your_file)" > your_file

Как объяснено в других ответах, вы не можете напрямую перенаправить вывод обратно во входной файл. Но вы можете сначала оценить команду sort, а затем перенаправить ее обратно в исходный файл. Таким образом, вы можете реализовать сортировку на месте.

Точно так же вы можете применить этот трюк к другой команде, такой как paste, чтобы реализовать построчное добавление.

2
Bo Tian
sort file | sponge file

Это в следующем пакете Fedora:

moreutils : Additional unix utilities
Repo        : Fedora
Matched from:
Filename    : /usr/bin/sponge
1
SilverlightFox

Вот подход, который (ab) использует vim:

vim -c :sort -c :wq -E -s "${filename}"

Часть -c :sort -c :wq вызывает команды vim после открытия файла. -E и -s необходимы для того, чтобы vim работал в «безголовом» режиме, который не обращается к терминалу.

Это почти не имеет преимуществ перед подходом sort -o "${filename}" "${filename}", за исключением того, что он принимает аргумент имени файла только один раз.


Для меня было полезно реализовать директиву formatter в записи nanorc для файлов .gitignore. Вот что я использовал для этого:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
1
Anthony Sottile

Вы хотите отсортировать все файлы в папке и подпапке, переопределяя их?

Использовать этот:

find . -type f -exec sort {} -o {} \;
0
luandrea