1

Тема: CMD/BAT: Поменять половинки файла местами

В текстовом файле есть набор целых чисел через пробелы, например:
57 931 4 1 123 9 78

Чисел в файле не более 100000. Известно, что в файле всегда присутствует число 1, позиция может быть любой. Надо получить новый текстовый файл, где бы сначала шла та часть, что от 1 и до конца файла, а далее начало файла, то, что до 1. В нашем примере надо получить такое:

1 123 9 78 57 931 4

Если появятся лишние пробелы - не страшно.

Вот как бы это сделать, причем в рамках одной команды (то есть чтобы можно было запускать прямо из командной строки)?

Можно было бы считать файл в строку (потянет ли батник такую длинную строку?), в for разделить по 1. Вот только 1 может встречаться и в других числах как отдельная цифра, а разделитель ведь может содержать только один символ, а не последовательность.

2

Re: CMD/BAT: Поменять половинки файла местами

Arigato пишет:

Вот только 1 может встречаться и в других числах как отдельная цифра, а разделитель ведь может содержать только один символ, а не последовательность.

set string=57 931 4 1 123 9 78
set string=%string: 1 =$%

Arigato пишет:

потянет ли батник такую длинную строку?

???

3

Re: CMD/BAT: Поменять половинки файла местами

cmd /v:on /c "set /p string=<input.txt& for /f "tokens=1,2 delims=$" %i in ("!string: 1 =$!") do @<nul set /p=1 %j %i"

4 (изменено: Yury, 2014-02-24 00:51:08)

Re: CMD/BAT: Поменять половинки файла местами

Yury пишет:
Arigato пишет:

потянет ли батник такую длинную строку?

???

Не "тянет".


А такой вариант работает со строками, практически, любой длины:

@echo off
set input_file=input.txt
set output_file=output.txt
>nul copy nul 0.tmp
fc /lb1000000 0.tmp "%input_file%"| more +3|>input.tmp find /v "*****"
del 0.tmp
for /f "tokens=1* delims=:" %%i in ('
 findstr /nc:" 1 " input.tmp
') do (
 set n=%%i
 set string=%%j
)
set string=%string: 1 =$%
(
for /f "tokens=2 delims=$" %%i in ("%string%") do (
 <nul set /p=1 %%i
)
for /f "tokens=1* delims=:" %%i in ('
 findstr /n .* input.tmp
') do (
 if %%i gtr %n% (
  <nul set /p=%%j
))
for /f "tokens=1* delims=:" %%i in ('
 findstr /n .* input.tmp
') do (
 if %%i lss %n% (
  <nul set /p=%%j
))
for /f "tokens=1 delims=$" %%i in ("%string%") do (
 <nul set /p=%%i
))>"%output_file%"
del input.tmp

5

Re: CMD/BAT: Поменять половинки файла местами

Спасибо за помощь. В общем, похоже что простого решения не получается.

6

Re: CMD/BAT: Поменять половинки файла местами

Отредактировал длинный код, устранив имевшуюся неточность.

7

Re: CMD/BAT: Поменять половинки файла местами

Тут не каждый редактор «потянет» строку длиной за 200000 символов .