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

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

Ответ 1

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

sort input-file > output_file

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

sort -o file file

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

Ответ 2

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

sort -o file file

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

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

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

sort file > tmp && mv tmp file

Ответ 3

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

echo "$(sort your_file)" > your_file

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

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

Ответ 4

Вот подход, который (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

Ответ 5

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

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

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

Ответ 6

sort file | sponge file

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

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge