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


206

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


Пожалуйста, обновите свой вопрос, чтобы четко объяснить, что вы хотите сделать с результатом сортировки файла. Вы хотите отсортировать его на месте, заменив несортированное содержимое fileна отсортированное содержимое того же файла? То, как ваш вопрос сформулирован в настоящий момент, вообще ничего не делать - это правильный ответ (вы не хотите ничего выводить, поэтому ничего не делайте).
Кит Томпсон,

@KeithThompson спасибо за вашу заботу на самом деле, я пытался отсортировать файл, но хочу избежать вывода на экран.
Али Саджид

Итак, куда вы хотите, чтобы вывод? В новый файл? В исходный файл? К принтеру по коридору?
Кит Томпсон,

1
В оригинальное досье
Али Саджид

запустить, sort infile >outfileи вы получите отсортированный вывод в файл "outfile". Тогда вы можете стереть оригинальный "infile", и все будет хорошо.
Луис Колорадо

Ответы:


410

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

sort input-file > output_file

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

sort -o file file

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


89
Хорошая заметка об общей ошибке
Дрейкс

1
Это очень удобно, когда вам нужно вручную редактировать словари для LaTeX, +1
Брайсон С.

6
Просто чтобы упомянуть важность порядка. Со GNU sortстраницы информации: -o OUTPUT-FILE' --output = OUTPUT-FILE 'Записать вывод в OUTPUT-FILE вместо стандартного вывода. В более новых системах -o' cannot appear after an input file if POSIXLY_CORRECT 'устанавливается, например, sort F -o F'. Portable scripts should specify -o OUTPUT-FILE' перед любыми входными файлами.
Яссин ЭльБадауи

14
Чтобы не повторять имя файла:sort -o file{,}
tstenner

65

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

sort -o file file

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

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

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

sort file > tmp && mv tmp file

2
+ ^ за лучший ответ, и с неоднозначным вопросом тоже, но все же на верхнем строчке рейтинга, поэтому нуждается в повышении.
u2n

6
sort file | sponge file

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

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

1
Это также работает на Ubuntu после установки с помощьюsudo apt install moreutils
Serge

4

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

echo "$(sort your_file)" > your_file

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

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


1
Это плохо, потому что он не будет работать с большими файлами, с разделителями, заканчивающимися символами новой строки, echoможет связываться с экранированием от обратной косой черты в POSIX и -oработает с тем же файлом, что и ввод, как объяснено на: stackoverflow.com/a/29244387/895245
Ciro Santilli 郝海东法轮功 病 六四 事件 法轮功

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

4
Вы используете VIM в своем nanorc? О, ирония.
Бретт Холман

2

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

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

find . -type f -exec sort {} -o {} \;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.