Я хотел бы отсортировать текстовый файл по 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.

1 ответ1

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .