0 / 0 / 0
Регистрация: 07.09.2018
Сообщений: 31
1

Поменять четные и нечетные слова местами

24.09.2018, 21:31. Показов 6046. Ответов 24

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Помогите пожалуйста написать скрипт на powershell.

Нужно во входном потоке строк, которые считываются из файла, поменять в каждой строке четные и нечетные слова местами. Результат записать в отдельный файл. Имена файлов задать через параметры командной строки.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2018, 21:31
Ответы с готовыми решениями:

Поменять четные и нечетные слова местами
Доброго времени суток. Помогите пожалуйста написать скрипт на cmd. Нужно во входном потоке...

Поменять местами чётные и нечётные слова
Разработать программу для ввода преобразования вывода строк. 1.Без использования методов класса...

Поменять местами четные и нечетные символы слова
Как поменять местами четные и нечетные символы слова? Заранее спс!

Поменять местами четные и нечетные, по порядку слова
Здравствуйте. Обрисую ситуацию: есть задание "Ввести с клавиатуры предложение. Поменять местами...

24
Любознательный
5649 / 1667 / 311
Регистрация: 10.03.2016
Сообщений: 3,776
25.09.2018, 05:29 2

Не по теме:

Неужели студентам стали выдавать задание на powershell, а не на cmd? :)


Но задачка интересная, поэтому требуются уточнения:
Цитата Сообщение от DerriK_N Посмотреть сообщение
поменять в каждой строке четные и нечетные слова местами.
Каков практический смысл сего?
Что является разделителем слов?
Кодировка входных файлов?
Нужен пример текстового файла.
1
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
25.09.2018, 11:11 3
DerriK_N, А если в строке нечетное количество слов, с чем менять последнее нечетное слово?

Для четного количество слов в строке можно использовать примерно следующее:

PowerShell
1
2
3
4
5
6
7
8
$text="Лук Редис Петрушка Клен Вареник Глаз Рог Пельмень"
$Result_Array=New-Object system.collections.arraylist
$Result_Array.addrange($text.split())
for($i=0;$i -lt $Result_Array.count;$i+=2)
{
    $Result_Array.GetRange($i,2).reverse()
}
$result_String=$Result_Array -join " "
2
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2018, 12:41 4
Цитата Сообщение от DerriK_N Посмотреть сообщение
Нужно во входном потоке строк, которые считываются из файла, поменять в каждой строке четные и нечетные слова местами.
Ещё вопрос, а что делать со знаками препинания, тире, кавычками и т.п.?

Допустим, что слова получаем просто используя пробел как разделитель, тогда вот один из простых вариантов:

text.txt
Кликните здесь для просмотра всего текста
Жили себе дед да баба,
Была у них курочка ряба.
Снесла курочка яичко.
Яичко не простое — золотое.
Дед бил, бил —
Не разбил.
Баба била-била —
Не разбила.
Мышка бежала,
Хвостиком махнула,
Яичко упало и разбилось.
Дед плачет, баба плачет,
Курочка кудахчет:
«Не плачь, дед, не плачь, баба!
Я снесу вам яичко другое,
Не золотое — простое».


PowerShell
1
2
3
4
5
6
7
foreach ($s in Get-Content .\text.txt)
{
    $i = 0; $a = $s -split ' '
    $r = ($a | % {if ($i%2 -eq 1) {$_ + ' ' + $a[$i-1]}; $i++ }) -join ' '
    
    if ($a.Length%2 -eq 1) {$r + ' ' + $a[-1]} else {$r}
}
Результат:
Кликните здесь для просмотра всего текста
себе Жили да дед баба,
у Была курочка них ряба.
курочка Снесла яичко.
не Яичко — простое золотое.
бил, Дед — бил
разбил. Не
била-била Баба —
разбила. Не
бежала, Мышка
махнула, Хвостиком
упало Яичко разбилось. и
плачет, Дед плачет, баба
кудахчет: Курочка
плачь, «Не не дед, баба! плачь,
снесу Я яичко вам другое,
золотое Не простое». —
1
Любознательный
5649 / 1667 / 311
Регистрация: 10.03.2016
Сообщений: 3,776
25.09.2018, 13:13 5
Цитата Сообщение от DerriK_N Посмотреть сообщение
Результат записать в отдельный файл. Имена файлов задать через параметры командной строки.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[cmdletbinding()]
Param (
    [parameter(mandatory=$true,
    helpmessage="Укажите файлы для разбора в качестве параметра `
    (набор файлов указывается через запятую)")]
    [array]$files
)
 
gi $files|%{
    $f_out = $_.basename + '_out' + $_.extension
    $tmp = gc $_.fullname -enc utf8|%{
        $a = ($b = $_ -split ' ')|%{$i=0}{
            switch($i%2){
                0{$b[$i+1]}
                1{$b[$i-1]}
            }
            $i++
        }
        $a -join ' '
    }
    $tmp|sc $f_out -enc utf8
}
1
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2018, 13:21 6
YuS_2, если в строке нечётное количество слов, тогда последнее слово пропадёт. Ну и переменную $tmp можно не использовать:

PowerShell
1
gc $_.fullname -enc utf8|%{} | sc $f_out -enc utf8
2
Любознательный
5649 / 1667 / 311
Регистрация: 10.03.2016
Сообщений: 3,776
25.09.2018, 15:06 7
Цитата Сообщение от KDE777 Посмотреть сообщение
если в строке нечётное количество слов, тогда последнее слово пропадёт.
А, да, этот момент прозевал... спасибо.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[cmdletbinding()]
Param (
    [parameter(mandatory=$true,
    helpmessage="Укажите файлы для разбора в качестве параметра `
    (набор файлов указывается через запятую)")]
    [array]$files
)
 
gi $files|%{
    $f_out = $_.basename + '_out' + $_.extension
    gc $_.fullname -enc utf8|%{
        $a = ($b = $_ -split ' ')|%{$i=0}{
            switch($i%2){
                0{if($b.count-1 -eq $i)
                    {$b[$i]}else{$b[$i+1]}
                }
                1{$b[$i-1]}
            }
            $i++
        }
        $a -join ' '
    }|sc $f_out -enc utf8
}
Цитата Сообщение от KDE777 Посмотреть сообщение
Ну и переменную $tmp можно не использовать
можно... можно вообще всё вытянуть в одну строку, но зачем? Мне такая запись больше нравится.
хотя... поправил, код короче выглядит.
1
0 / 0 / 0
Регистрация: 07.09.2018
Сообщений: 31
25.09.2018, 15:15  [ТС] 8
Прошу прощения, вы правы, нужно сделать в cmd))
А текстовый файл можно брать любой, его содержимое так же можеть бить разное, допустим:
один два три
четыре пять шесть
семь и тд.
0
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2018, 15:28 9
Цитата Сообщение от YuS_2 Посмотреть сообщение
хотя... поправил, код короче выглядит.
Тогда и $a можно убрать, как лишнюю

PowerShell
1
2
3
4
5
6
7
8
9
gc $_.fullname -enc utf8 | %{
    (($b = $_ -split ' ') | % {$i=0} {
        switch($i%2) {
            0 { if($b.count-1 -eq $i) {$b[$i]} else{$b[$i+1]} }
            1 { $b[$i-1] }
        }
        $i++
    }) -join ' '
}
1
0 / 0 / 0
Регистрация: 07.09.2018
Сообщений: 31
25.09.2018, 15:31  [ТС] 10
Очень вам благодарен, можете пожалуйста еще интерпретировать этот код под cmd???
0
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
25.09.2018, 15:32 11
Прошу прощения, вы правы, нужно сделать в cmd))
Расходимся)
В университетах по-прежнему учат средневековью)
2
0 / 0 / 0
Регистрация: 07.09.2018
Сообщений: 31
25.09.2018, 15:34  [ТС] 12
Ахахахаха
0
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2018, 17:13 13
Лучший ответ Сообщение было отмечено YuS_2 как решение

Решение

Цитата Сообщение от DerriK_N Посмотреть сообщение
можете пожалуйста еще интерпретировать этот код под cmd???
Windows Batch file
1
powershell.exe -ExecutionPolicy Bypass -NonInteractive -NoProfile -NoLogo -Command "&{gc c:\1\text.txt|%{$r=(($a=$_.Split())|%{$i=0}{if($i%2 -eq 0){$a[$i+1]}else{$a[$i-1]};$i++ }) -join ' ';if($a.Length%2 -eq 1){$r+$a[-1]}else{$r}}|sc c:\1\text_out.txt}"
Добавлено через 3 минуты
Цитата Сообщение от DerriK_N Посмотреть сообщение
Имена файлов задать через параметры командной строки.
А как заменить "c:\1\text.txt" и "c:\1\text_out.txt" на параметры для cmd-файла, спросите в ветке по cmd

Добавлено через 1 час 17 минут
Ну и пусть будет ещё один вариант, а то if-else (да ещё и дважды) мне глаза мозолил

PowerShell
1
gc $in | % { (($a = $_.split()) | % {$i=1} {$a[$i,($i-1)]; $i+=2}) -join ' ' }
DerriK_N, т.е. в cmd это будет выглядеть так:

Windows Batch file
1
powershell.exe -ExecutionPolicy Bypass -NonInteractive -NoProfile -NoLogo -Command "&{gc c:\1\1.txt|%{(($a=$_.split())|%{$i=1}{$a[$i,($i-1)];$i+=2})-join' '}|sc c:\1\2.txt}"
1
0 / 0 / 0
Регистрация: 07.09.2018
Сообщений: 31
25.09.2018, 17:20  [ТС] 14
Спасибо, значит по факту нужно правильно заменить пути к текстовым файлам, и тогда програма будет работать под cmd??
0
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2018, 17:47 15
Лучший ответ Сообщение было отмечено DerriK_N как решение

Решение

Цитата Сообщение от DerriK_N Посмотреть сообщение
значит по факту нужно правильно заменить пути к текстовым файлам, и тогда програма будет работать под cmd??
Да. Только ещё не забыть про экранирование "%"

convert.cmd
Windows Batch file
1
powershell.exe -ExecutionPolicy Bypass -NonInteractive -NoProfile -NoLogo -Command "&{gc %1 |%%{(($a=$_.split())|%%{$i=1}{$a[$i,($i-1)];$i+=2})-join' '}|sc %2}"
Запуск:
Код
c:\>convert.cmd c:\1\text.txt c:\1\text_out.txt
Добавлено через 6 минут

Не по теме:

Цитата Сообщение от DerriK_N Посмотреть сообщение
и тогда програма будет работать под cmd
И передайте там, где всё ещё учат cmd (если это не какая-то археологическая специальность), что PowerShell существует уже 15 лет и работает начиная с WinXP...

0
0 / 0 / 0
Регистрация: 07.09.2018
Сообщений: 31
25.09.2018, 19:27  [ТС] 16
Хорошо)) Правда я все еще не могу вашу програму запустить, ввожу в командной строке
C++
1
convert.cmd c:\1\text.txt c:\1\text_out.txt
(Все расположение файлов верны) запускаю через командную строку и чет никак... Возможно я где то туплю, или может в коде что то не то. Пока времени нет, делаю код в С++, завтра попробую еще раз запустить)) Но все равно БОЛЬШОЕ ВАС СПАСИО!)
P.S. Для чего в коде powershell.exe если мне нужно прогу в .cmd сделать?? Просветите чайника))
0
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2018, 20:48 17
Цитата Сообщение от DerriK_N Посмотреть сообщение
запускаю через командную строку и чет никак..
У меня всё работает (вариант из ответа #15).

Для начала запустите просто PowerShell, вставьте строчку показанную ниже (вместо c:\1\1.txt введите ваш путь к исходному тексту) и проверьте, что на экране корректно отобразится преобразованный текст:

PowerShell
1
gc 'c:\1\1.txt' |%{(($a=$_.split())|%{$i=1}{$a[$i,($i-1)];$i+=2})-join' '}
Цитата Сообщение от DerriK_N Посмотреть сообщение
Для чего в коде powershell.exe если мне нужно прогу в .cmd сделать??
Вы просили cmd-скрипт, который будет принимать два параметра и преобразовывать текст. Вы его получили. В скрипте, для решения задачи, используется powershell.exe (с параметрами), так же, как если бы я запускал из cmd tasklist, reg, net, route, ipconfig, nslookup, systeminfo и т.д., и т.п.

Добавлено через 10 минут
Кликните здесь для просмотра всего текста

Код
c:\1>dir

 Содержимое папки c:\1

25.09.2018  20:45    <DIR>          .
25.09.2018  20:45    <DIR>          ..
25.09.2018  20:43               704 1.txt
25.09.2018  20:44               173 convert.cmd
               2 файлов            877 байт
               2 папок  18*766*258*176 байт свободно

c:\1>type c:\1\1.txt
Жили себе дед да баба,
Была у них курочка ряба.
Снесла курочка яичко.
Яичко не простое — золотое.
Дед бил, бил —
Не разбил.
Баба била-била —
Не разбила.
Мышка бежала,
Хвостиком махнула,
Яичко упало и разбилось.
Дед плачет, баба плачет,
Курочка кудахчет:
«Не плачь, дед, не плачь, баба!
Я снесу вам яичко другое,
Не золотое — простое».
c:\1>convert.cmd c:\1\1.txt c:\1\2.txt

c:\1>powershell.exe -ExecutionPolicy Bypass -NonInteractive -NoProfile -NoLogo -Command "&{gc c:\1\1.txt |%{(($a=$_.split())|%{$i=1}{$a[$i,($i-1)];$i+=2})-join' '}|sc c:\1\2.txt -enc Unicode}"

c:\1>dir

 Содержимое папки c:\1

25.09.2018  20:45    <DIR>          .
25.09.2018  20:45    <DIR>          ..
25.09.2018  20:43               704 1.txt
25.09.2018  20:45               708 2.txt
25.09.2018  20:44               173 convert.cmd
               3 файлов          1*585 байт
               2 папок  18*766*376*960 байт свободно

c:\1>type c:\1\2.txt
себе Жили да дед баба,
у Была курочка них ряба.
курочка Снесла яичко.
не Яичко — простое золотое.
бил, Дед — бил
разбил. Не
била-била Баба  —
разбила. Не
бежала, Мышка
махнула, Хвостиком
упало Яичко разбилось. и
плачет, Дед плачет, баба
кудахчет: Курочка
плачь, «Не не дед, баба! плачь,
снесу Я яичко вам другое,
золотое Не простое». —

c:\1>
1
0 / 0 / 0
Регистрация: 07.09.2018
Сообщений: 31
25.09.2018, 20:48  [ТС] 18
Да, отображается все корректно
0
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2018, 20:52 19
Цитата Сообщение от DerriK_N Посмотреть сообщение
Да, отображается все корректно
Тогда ещё раз проверьте, что содержимое cmd-файла, соответствует показанному в ответе #15
0
0 / 0 / 0
Регистрация: 07.09.2018
Сообщений: 31
25.09.2018, 20:54  [ТС] 20
Значит как я понял надо вот этот код
C++
1
powershell.exe -ExecutionPolicy Bypass -NonInteractive -NoProfile -NoLogo -Command "&{gc %1 |%%{(($a=$_.split())|%%{$i=1}{$a[$i,($i-1)];$i+=2})-join' '}|sc %2}"
забросить в *.txt, и создать с него файл под названием convert.cmd
Потом зайти в PowerShell и запустить вот этот код
C++
1
c:\>convert.cmd c:\1\text.txt c:\1\text_out.txt
только в начале указать директиву, где расположен мой файл convert.cmd, да?
0
25.09.2018, 20:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2018, 20:54
Помогаю со студенческими работами здесь

Как поменять местами четные и нечетные слова
Задание таково, нужно поменять так что-бы четные и нечетные слова поменялись местами. Заранее...

Дано предложение, слова в нем разделены пробелом, поменять местами четные и нечетные по порядку следования слова
Пожалуйста помогите решить задачу по Java до четверга (12.11.2010) Дано предложение, слова в...

Поменять местами все четные и нечетные слова в строке
Задана строка символов, содержащая два или более слов, разделенных пробелами. Написать программу,...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru