Windows CLI: сортировка текстовых файлов по столбцам

438
masher

Я хотел бы отсортировать текстовый файл по 3-му столбцу данных, а не по 3-му символу, используя команды командной строки Windows. Команды будут помещены в командный файл.

Данные будут выглядеть примерно так

#filename seqno phasename a b c scale Rwp blah_001.xye 1 corundum 3 3 12 0.001 3 blah_001.xye 1 silicon 5.4 5.4 5.4 0.002 3 blah_002.xye 2 corundum 3.1 3.1 12.1 0.002 3.5 blah_002.xye 2 silicon 5.41 5.41 5.41 0.004 3.5 blah_003.xye 3 corundum 3.2 3.2 12.2 0.001 3.1 blah_003.xye 3 silicon 5.42 5.42 5.42 0.002 3.1 blah_004.xye 4 corundum 3.4 3.4 12.2 0.001 3.2 blah_004.xye 4 silicon 5.43 5.43 5.43 0.002 3.2 blah_005.xye 5 corundum 3.5 3.5 12.3 0.001 3.9 blah_005.xye 5 silicon 5.44 5.44 5.44 0.002 3.9 blah_006.xye 6 corundum 3.6 3.6 12.3 0.001 3.1 blah_006.xye 6 silicon 5.45 5.45 5.45 0.002 3.1 

Я хочу отсортировать по фазенаме. Если было бы хорошо, если бы я мог сохранить первый ряд на месте. После 3-го столбца будет более 5 столбцов, и будет больше строк, чем это, но сортировка всегда будет выполняться по 3-му столбцу.

Я видел этот вопрос, но не могу расшифровать команды for.

0
Я рекомендую вашему вниманию [обширную информацию на SS64 по команде `FOR`] (https://ss64.com/nt/for.html) или [собственную документацию Microsoft по команде` FOR`] (https: / /docs.microsoft.com/en-us/windows-server/administration/windows-commands/for) или даже вывод `HELP FOR`. Jeff Zeitlin 6 лет назад 0

1 ответ на вопрос

0
dbenham

Ваш файл использует формат с фиксированной шириной, поэтому вы всегда хотите начать сортировку с позиции 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.

  • Сортировать встроенные числа как числа вместо текста
  • Сортировка по токену с разделителями вместо фиксированной позиции
  • Сохранить только уникальные линии
  • Ограничить количество выходных строк