Программа на bash (Генерация случайных слов из двух текстовых файлов)
Модераторы: /dev/random, Модераторы разделов
-
djo
- Сообщения: 18
- ОС: Debian
Программа на bash
Здравствуйте! Как можно реализовать на bash такую программу, чтобы при запуске в папке с двумя текстовыми файлами, она выводила на терминал по одному произвольному слову из списка текстовых файлов?
-
shotdownsystem
- Сообщения: 423
- ОС: Basic command interpreter
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
-
Nazyvaemykh
- Сообщения: 438
- Статус: Подопытный участник
Re: Программа на bash
Я бы использовал sort --random-sort, разве что это не программа на bash, а программа на C из набора GNU coreutils, например (если говорить о системе GNU).
А не, это не то, перегрелся, прочитал неправильно…
А не, это не то, перегрелся, прочитал неправильно…
¡ Страсть к разрушению есть творческая страсть!
-
Nazyvaemykh
- Сообщения: 438
- Статус: Подопытный участник
Re: Программа на bash
Хотя, почему не то, может быть, и sort --random-sort сойдет.
Разбить на слова, перемешать, и выводить по одному случайному слову из каждого файла. Можно paste использовать, к примеру.
Разбить на слова, перемешать, и выводить по одному случайному слову из каждого файла. Можно paste использовать, к примеру.
¡ Страсть к разрушению есть творческая страсть!
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Программа на bash
есть же shuf (:
Код: Выделить всё
for file in *.txt; do cat "$file" | tr ' ' '\n' | shuf | head -1 ; doneUNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
-
Nazyvaemykh
- Сообщения: 438
- Статус: Подопытный участник
Re: Программа на bash
SLEDopit, спасибо, про shuf забыл, потому что не пользовался, а вот наличий рандома у sort запомнил, потому что удивился, зачем он нужен. (:
¡ Страсть к разрушению есть творческая страсть!
-
Babusha
- Сообщения: 203
- ОС: Убунту
Re: Программа на bash
Код: Выделить всё
#!/usr/bin/ruby -Ku
case rand 2
when 0
file = File.open("testbldldld.txt").readlines
puts file[rand file.size]
when 1
file = File.open("tttttt.txt").readlines
puts file[rand file.size]
end-
Lan4
- Сообщения: 339
- Статус: hikki
- ОС: Arch
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Программа на bash
разбить текст на слова можно так:
Код: Выделить всё
$ sed -r '
/\w/!d
s/\W+$//
s/\>\W+/\n/g
s/^\W*//
'-
ZyX
- Сообщения: 355
- ОС: Gentoo
Re: Программа на bash
drBatty писал(а): ↑23.07.2011 21:41разбить текст на слова можно так:
Код: Выделить всё
$ sed -r ' /\w/!d s/\W+$// s/\>\W+/\n/g s/^\W*// '
Если я правильно понял, что тут происходит, то вы слишком переусложняете. Зачем тут целых четыре выражения вместо одного:
(Created by format.vim)
perl -p -e 's/\W+/\n/sg'
(Как это будет на sed мне думать совершенно неохота.)
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Программа на bash
мне проще было скопипастить скрипт. (:
А что значит постфиксное s в выражении s///s ?
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Программа на bash
Код: Выделить всё
$ man -P cat perlre | sed -n '/\ss\s/,+3p'
s Treat string as single line. That is, change "." to match any character whatsoever, even a newline,
which normally it would not match.
Used together, as /ms, they let the "." match any character whatsoever, while still allowing "^" and "$"
Global matching, and keep the Current position after failed matching. Unlike i, m, s and x, these two
flags affect the way the regex is used rather than the regex itself. See "Using regular expressions in
Perl" in perlretut for further explanation of the g and c modifiers.Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Программа на bash
ну у меня получается в итоге без пустых дырок между строчками, т.е. у вас вставляются лишние пустые строки. А так да, модификатора s в sed нету. :(
В случае если он нужен, придётся подгружать строчки командой N, потом выводить P, и удалять хвосты D. Что конечно не очень удобно...
В случае если он нужен, придётся подгружать строчки командой N, потом выводить P, и удалять хвосты D. Что конечно не очень удобно...
-
ZyX
- Сообщения: 355
- ОС: Gentoo
Re: Программа на bash
Где? Лишние не вставляются, просто сохраняются все уже существующие (вообще‐то, это моя недоработка: я забыл, что в данном случае perl отрабатывает построчно). Можно использоватьdrBatty писал(а): ↑26.07.2011 19:59ну у меня получается в итоге без пустых дырок между строчками, т.е. у вас вставляются лишние пустые строки. А так да, модификатора s в sed нету.
В случае если он нужен, придётся подгружать строчки командой N, потом выводить P, и удалять хвосты D. Что конечно не очень удобно...
(Created by format.vim)
perl -e '($_=join"",<>)=~s/\W+/\n/gs;print$_'
(при этом грузить всё в память), можно добавить ; undef $_ if $_ eq "\n" после выражения‐замены. (Или же ; s/^\n$//s, но я предпочитаю не использовать регулярные выражения в случаях, когда решение без них примерно так же или даже менее трудозатратно.)
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Программа на bash
$
ksu@ksu:~/test$ cat gg
** (gnome-control-center:11149): WARNING **: get_actions_list() - PROBLEM - Can't load gtk-theme-selector.desktop
** (gnome-control-center:11149): WARNING **: get_actions_list() - PROBLEM - Can't load gnome-cups-manager.desktop
ksu@ksu:~/test$ cat gg | perl -p -e 's/\W+/\n/sg'
gnome
control
center
11149
WARNING
get_actions_list
PROBLEM
Can
t
load
gtk
theme
selector
desktop
gnome
control
center
11149
WARNING
get_actions_list
PROBLEM
Can
t
load
gnome
cups
manager
desktop
ksu@ksu:~/test$ cat gg | sed -r '
> /\w/!d
> s/\W+$//
> s/\>\W+/\n/g
> s/^\W*//
> '
gnome
control
center
11149
WARNING
get_actions_list
PROBLEM
Can
t
load
gtk
theme
selector
desktop
gnome
control
center
11149
WARNING
get_actions_list
PROBLEM
Can
t
load
gnome
cups
manager
desktop
угу... вот так всегда...
ладно, не сегодня. моё выражение не оптимальное, дальше в книжке есть короче.
кстати, если можно всё грузить в память, то на сед тоже получается просто и легко (:
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Программа на bash
Так интересно за вами наблюдать, господа. В любой теме, где встречаются drBatty и ZyX начинается очередной раунд perl vs sed, применимо к данной проблеме. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Программа на bash
всё потому, что
Типичная программа на Перле выглядит так, как будто программист бился головой об клавиатуру; и чаще всего оно так и есть
(:
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Программа на bash
всё потому, что некоторые спорят о вкусах·
и временами это получается вкус тех самых устриц…
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог