Як сортувати файл на місці


205

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


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

@KeithThompson дякую за вашу стурбованість, я намагався сортувати файл, але хотів уникнути виводу на екран.
Алі Садід

То куди ви хочете, щоб виходило? У новий файл? У вихідний файл? До принтера вниз по залі?
Кіт Томпсон

1
В оригінальний файл
Алі Садід

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

Відповіді:


408

Ви можете використовувати перенаправлення файлів для перенаправлення відсортованого виводу:

sort input-file > output_file

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

sort -o file file

Примітка: Поширена помилка полягає у спробі перенаправити вихід на той самий вхідний файл (наприклад, sort file > file). Це не працює, оскільки оболонка робить переспрямування (не програма сортування (1) ), а вхідний файл (як вихідний також) буде стертий безпосередньо перед тим, як надавати програмі сортування (1) можливість його читання.


88
Гарна примітка про поширену помилку
Дрейкс

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 Stroobandt

4

Щоб сортувати файл за місцем, спробуйте:

echo "$(sort your_file)" > your_file

Як пояснено в інших відповідях, ви не можете безпосередньо перенаправляти висновок назад у вхідний файл. Але ви можете оцінитиsort спочатку команду, а потім перенаправити її назад у вихідний файл. Таким чином ви можете реалізувати на місці сортування.

Аналогічно, ви можете також застосувати цей трюк до іншої команди, як-от pasteреалізувати додавання до рядків.


1
Це погано , тому що він не буде працювати на великі файли, смуги , закінчуються символів нового рядка, echoможе сплутати з вісімковими в POSIX, і -oробить роботу для того ж файлу в якості вхідних даних , як описано в: stackoverflow.com/a/29244387/895245
Чіро Сантіллі郝海东冠状 病 六四 事件 法轮功

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.