Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Размножить каждую строку в txt файле n количество раз (http://forum.oszone.net/showthread.php?t=341198)

Alexander_88 06-07-2019 23:04 2878519

Размножить каждую строку в txt файле n количество раз
 
Здравствуйте, подскажите как можно размножить строки в txt файле n количество раз?

к примеру:
был txt:

Код:

qqqqqqq
rrrrrrrr
222222
ggggggggg
ggggg

мы указываем в скрипте количество дубликатов "3" и должно получиться так:
Код:

qqqqqqq
qqqqqqq
qqqqqqq
rrrrrrrr
rrrrrrrr
rrrrrrrr
222222
222222
222222
ggggggggg
ggggggggg
ggggggggg
ggggg
ggggg
ggggg

Решение нужно powershell или BAT :)

Iska 06-07-2019 23:19 2878521

Как-то так — PowerTip: Use PowerShell to Multiply Strings | Scripting, например:
Код:

$iCount = 3

(
    Get-Content -Path 'C:\Мои проекты\0268\0001.txt' |`
        ForEach-Object -Process {
            ($_ + "`r`n") * $iCount
        }
) -join '' | Set-Content -Path 'C:\Мои проекты\0268\0002.txt'


Alexander_88 07-07-2019 02:37 2878527

Спасибо, все дублируется как нужно :)

greg zakharov 07-07-2019 16:24 2878613

Слишком много действий для такой простой задачи. В pwsh можно сделать все гораздо проще:
Код:

(sls "((.*))" E:\sandbox\input.txt).Matches.Groups.Value > E:\sandbox\output.txt
С помощью sed (дублирует строки прямо в оригинальном файле):
Код:

sed -i "p;p" E:\sandbox\input.txt
Решение на cmd:
Код:

@echo off
  setlocal enabledelayedexpansion
    set "file=E:\sandbox\input.md"
    set "repeat=3"
    for /f %%i in ('find /v /c "" ^< %file%') do set "lines=%%i"
    3<%file% (
      for /l %%i in (1,1,!lines!) do (
        set /p s=<&3
        for /l %%j in (1,1,!repeat!) do echo:!s!
      )
    ) >> E:\sandbox\output.txt
  endlocal
exit /b


Iska 07-07-2019 16:50 2878619

Цитата:

Цитата greg zakharov
В pwsh можно сделать все гораздо проще: »

А где здесь указывается количество?

P.S. Насчёт «проще» оставлю на Вашей совести :lol:.

megaloman 07-07-2019 16:58 2878621

CMD (дублирует строки прямо в оригинальном файле):
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\txt.txt"
        Set /A N=5
       
        Set /A Rep=10000000
        FOR /F "usebackq delims=" %%s IN ("%FileIn%") DO Set /A Rep+=1 &Call Set "@@%%Rep%%=%%s"
        >"%FileIn%" (FOR /F "usebackq tokens=1* delims==" %%a IN (`2^>nul Set "@@"`) DO (
                FOR /L %%i IN (1,1,%N%) DO (Echo %%b)
        ))
Pause
Exit /B


greg zakharov 07-07-2019 18:25 2878635

Iska, подобного рода заявлениями вы лишь указываете на свое незнание регэкспов.

Iska 07-07-2019 19:03 2878644

Коллега, подобного рода заявлениями вместо вменяемого ответа, Вы демонстрируете лишь свою спесь.

greg zakharov 07-07-2019 21:11 2878663

Iska, по себе ли кафтан примеряете? Завидуйте молча.

YuS_2 07-07-2019 21:24 2878665

Iska, greg zakharov, не ссорьтесь, ну нет причины же для этого... на ровном месте, можно сказать...

greg zakharov, ну, правда, не сложно ведь объяснить. Всего и вся на свете знать невозможно...
А на счет проще, тоже соглашусь, не совсем это просто. Для того, чтобы это показалось простым, необходимо слишком глубоко изучить ПО, вплоть до внутреннего устройства. Не всем необходимы настолько подробные знания, иногда они излишни, имхо.

Цитата:

Цитата Iska
А где здесь указывается количество? »

там просто используются возможности групп шаблона регвыра, от количества скобок будет зависеть количество повторов.

Iska 07-07-2019 21:59 2878672

YuS_2, спасибо, ясно.

Alexander_88 10-07-2019 01:54 2879088

Спасибо всем за ответы, теперь куча вариантов :)

А как можно взять текст прямо из скрипта? (не из txt файла, а текст в самом скрипте), текст будет как и в txt файле.. несколько строк, каждую нужно размножить, количество размножений нужно также указать в скрипте.

пример:

Код:

n=3
кодкодкодкодкодкодкодкод
кодкодкодкодкодкод
кодкодкодкодкодкодкодкод
кодкодкодкодДальше строки для размножения

qwerty
111
2222


output > result.txt

результат:

result.txt
Код:

qwerty
qwerty
qwerty
111
111
111
2222
2222
2222


Iska 10-07-2019 05:41 2879095

Например, так:
Код:

$iCount = 3

$sContent = @"
qwerty
111
2222
"@



(
    $sContent -split "`r`n" |`
        ForEach-Object -Process {
            ($_ + "`r`n") * $iCount
        }
) -join '' | Set-Content -Path 'C:\Мои проекты\0268\0002.txt'


megaloman 10-07-2019 06:45 2879098

Код:

@Echo Off
cls
        Call :Mult "%~dpnx0" "Out1=====" 5 "Z:\Box_Out\OutFile1.txt"
        Call :Mult "%~dpnx0" "Out2=====" 8 "Z:\Box_Out\OutFile2.txt"
Pause
Exit /B

:Mult
        FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /I /L /B /N %2 %1`) DO (
                >%4 (FOR /F "usebackq delims=" %%s IN (`2^>nul More +%%a %1`) DO (
                        Echo %%s|>nul 2>nul FINDSTR /I /L /B %2&&Exit /B
                        FOR /L %%i IN (1,1,%3) DO (Echo %%s)
                ))
        )
Exit /B

Out1=====

У попа была собака.
        Поп её любил.
Она съела кусок мяса -
        Поп её убил.

Out1=====

Out2=====

Ехала деревня
Мимо мужика.
Вдруг из-под собаки
Лают ворота.

Out2=====


Alexander_88 10-07-2019 10:17 2879117

Спасибо всем за ответы, куча вариантов на разных языках :)

YuS_2 10-07-2019 13:45 2879164

Цитата:

Цитата Iska
-join '' »

кстати, существует более понятный вариант (без -join '' и без "`r`n"), с точки зрения синтаксиса:
Код:

'строка1','строка2','строка3'|%{[array]$_*3}

Alexander_88 10-07-2019 19:09 2879222

Цитата:

Цитата YuS_2
кстати, существует более понятный вариант (без -join '' и без "`r`n"), с точки зрения синтаксиса: »

спасибо, самый сокращенный вариант, скрипт в одну строку, тоже в коллекцию сохраню, хотя строки, которые нужно размножать, у меня всегда в столбик прописаны.


Время: 01:44.

Время: 01:44.
© OSzone.net 2001-