Когда мы используем 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) возможность прочитать ее.
Это очень удобно, когда вам нужно вручную редактировать словари для 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переключателя ( Луис уверяет меня, что они существуют), вы можете добиться редактирования «на месте» стандартным способом:
Это также работает на Ubuntu после установки с помощьюsudo apt install moreutils
Serge
4
Чтобы отсортировать файл на месте, попробуйте:
echo "$(sort your_file)"> your_file
Как объяснялось в других ответах, вы не можете напрямую перенаправить вывод обратно во входной файл. Но вы можете sortсначала оценить команду, а затем перенаправить ее обратно в исходный файл. Таким образом, вы можете реализовать сортировку на месте.
Точно так же вы можете также применить этот трюк к другой команде, например, pasteдля реализации построчного добавления.
Это плохо, потому что он не будет работать с большими файлами, с разделителями, заканчивающимися символами новой строки, 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
file
на отсортированное содержимое того же файла? То, как ваш вопрос сформулирован в настоящий момент, вообще ничего не делать - это правильный ответ (вы не хотите ничего выводить, поэтому ничего не делайте).sort infile >outfile
и вы получите отсортированный вывод в файл "outfile". Тогда вы можете стереть оригинальный "infile", и все будет хорошо.Ответы:
Вы можете использовать перенаправление файлов для перенаправления отсортированного вывода:
Или вы можете использовать
-o
,--output=FILE
возможность сортировать указать тот же входной и выходной файл:Примечание. Распространенной ошибкой является попытка перенаправить вывод в один и тот же входной файл (например
sort file > file
). Это не работает, поскольку оболочка выполняет перенаправления (не программа sort (1) ), а входной файл (как и вывод) также будет удален непосредственно перед тем, как дать программе sort (1) возможность прочитать ее.источник
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' перед любыми входными файлами.sort -o file{,}
Команда
sort
выводит результат операции сортировки на стандартный вывод по умолчанию. Чтобы добиться сортировки на месте, вы можете сделать это:Это перезаписывает ввод
file
отсортированным выводом.-o
Переключатель используется для задания выходного сигнала, определяется POSIX , поэтому должны быть доступны на всех версииsort
:Если вам не повезло иметь версию
sort
без-o
переключателя ( Луис уверяет меня, что они существуют), вы можете добиться редактирования «на месте» стандартным способом:источник
Это в следующем пакете Fedora:
источник
sudo apt install moreutils
Чтобы отсортировать файл на месте, попробуйте:
Как объяснялось в других ответах, вы не можете напрямую перенаправить вывод обратно во входной файл. Но вы можете
sort
сначала оценить команду, а затем перенаправить ее обратно в исходный файл. Таким образом, вы можете реализовать сортировку на месте.Точно так же вы можете также применить этот трюк к другой команде, например,
paste
для реализации построчного добавления.источник
echo
может связываться с экранированием от обратной косой черты в POSIX и-o
работает с тем же файлом, что и ввод, как объяснено на: stackoverflow.com/a/29244387/895245Вот подход, который (ab) использует
vim
:Эти
-c :sort -c :wq
команды порция вызывает в VIM после открытия файла.-E
и-s
необходимы для того, чтобы vim работал в режиме «без головы», который не обращается к терминалу.Это почти не имеет преимуществ перед
sort -o "${filename}" "${filename}"
подходом, за исключением того, что он принимает аргумент имени файла только один раз.Это было полезно для меня, чтобы реализовать
formatter
директиву вnanorc
записи для.gitignore
файлов. Вот что я использовал для этого:источник
nanorc
? О, ирония.Хотите отсортировать все файлы в папке и подпапке, переопределяя их?
Использовать это:
источник