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

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
SilverlightFox
источник
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 {} \;
luandrea
источник