Ваш файл использует формат с фиксированной шириной, поэтому вы всегда хотите начать сортировку с позиции 21.
Команда SORT
предоставляет возможность выполнять сравнение каждой строки, начиная с определенной позиции в строке. Единственным недостатком является то, что он не обеспечивает механизм для сохранения записи заголовка наверху.
Таким образом, хитрость заключается в том, SET /P
чтобы прочитать первую строку и записать ее в новый файл. Затем используйте MORE +1
для чтения все, кроме 1-й строки, и передайте это SORT \+21
и добавьте результат в новый файл. Последнее, что нужно сделать, это перезаписать исходный файл новым MOVE
.
@echo off setlocal enableDelayedExpansion set "file=test.txt" set /p "ln=" < "%file%" >"%file%.new" ( echo(!ln! more +1 "%file%" | sort /+21 ) move /y "%file%.new" "%file%" >nul
У этой стратегии есть ограничения:
- БОЛЬШЕ будет зависать, если файл превышает 64 тыс. Строк
- БОЛЬШЕ преобразует вкладки в пробелы
- Строка заголовка не должна превышать 1021 символов из-за ограничений SET / P.
В качестве альтернативы вы можете использовать мою утилиту JSORT.BAT для простого и эффективного выполнения сортировки с помощью одной простой команды. ДВИЖЕНИЕ все еще требуется.
@echo off call test.txt /p 21 /s 1 /o test.txt.new move /y test.txt.new test.txt >nul
JSORT - это чистый скрипт (гибридный JScript / batch), который работает на любом компьютере под управлением Windows начиная с XP. Не требуется сторонний exe-файл.
Обратите внимание, что JSORT по умолчанию выполняет поиск с учетом регистра, в отличие от встроенной команды SORT. Не проблема с вашим примером текста, но если вы хотите игнорировать регистр, просто добавьте /I
опцию.
JSORT имеет ограничение по размеру из-за того, что весь файл должен помещаться в одну строковую переменную в памяти. Я не уверен насчет точного значения, но я считаю, что максимальный поддерживаемый размер файла составляет чуть менее 1 ГБ.
Прочтите встроенную справку, чтобы узнать о некоторых изящных функциях, которые поддерживает JSORT.
- Сортировать встроенные числа как числа вместо текста
- Сортировка по токену с разделителями вместо фиксированной позиции
- Сохранить только уникальные линии
- Ограничить количество выходных строк