Программа на bash (Генерация случайных слов из двух текстовых файлов)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

djo
Сообщения: 18
ОС: Debian

Программа на bash

Сообщение djo »

Здравствуйте! Как можно реализовать на bash такую программу, чтобы при запуске в папке с двумя текстовыми файлами, она выводила на терминал по одному произвольному слову из списка текстовых файлов?
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: Программа на bash

Сообщение shotdownsystem »

лаба ?
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Программа на bash

Сообщение eddy »

man random, man wc, man sed
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Программа на bash

Сообщение Nazyvaemykh »

Я бы использовал sort --random-sort, разве что это не программа на bash, а программа на C из набора GNU coreutils, например (если говорить о системе GNU).

А не, это не то, перегрелся, прочитал неправильно…
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Программа на bash

Сообщение Nazyvaemykh »

Хотя, почему не то, может быть, и sort --random-sort сойдет.
Разбить на слова, перемешать, и выводить по одному случайному слову из каждого файла. Можно paste использовать, к примеру.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Программа на bash

Сообщение SLEDopit »

Nazyvaemykh писал(а):
01.07.2011 16:55
sort --random-sort
есть же shuf (:
djo писал(а):
01.07.2011 16:06
Здравствуйте! Как можно реализовать на bash такую программу, чтобы при запуске в папке с двумя текстовыми файлами, она выводила на терминал по одному произвольному слову из списка текстовых файлов?

Код: Выделить всё

for file in *.txt; do cat "$file" | tr ' ' '\n' | shuf | head -1 ; done
UNIX 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.
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Программа на bash

Сообщение Nazyvaemykh »

SLEDopit, спасибо, про shuf забыл, потому что не пользовался, а вот наличий рандома у sort запомнил, потому что удивился, зачем он нужен. (:
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Babusha
Сообщения: 203
ОС: Убунту

Re: Программа на bash

Сообщение Babusha »

Код: Выделить всё

#!/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

Re: Программа на bash

Сообщение Lan4 »

Babusha
Просили вроде как на баше...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Программа на bash

Сообщение drBatty »

разбить текст на слова можно так:

Код: Выделить всё

$ sed -r '
/\w/!d
s/\W+$//
s/\>\W+/\n/g
s/^\W*//
'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Программа на bash

Сообщение ZyX »

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

Сообщение drBatty »

ZyX писал(а):
25.07.2011 21:45
Если я правильно понял, что тут происходит, то вы слишком переусложняете

мне проще было скопипастить скрипт. (:

А что значит постфиксное s в выражении s///s ?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Программа на bash

Сообщение sash-kan »

drBatty писал(а):
26.07.2011 13:48
А что значит постфиксное s в выражении s///s ?

Код: Выделить всё

$ 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

Сообщение drBatty »

ну у меня получается в итоге без пустых дырок между строчками, т.е. у вас вставляются лишние пустые строки. А так да, модификатора s в sed нету. :(
В случае если он нужен, придётся подгружать строчки командой N, потом выводить P, и удалять хвосты D. Что конечно не очень удобно...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Программа на bash

Сообщение ZyX »

drBatty писал(а):
26.07.2011 19:59
ну у меня получается в итоге без пустых дырок между строчками, т.е. у вас вставляются лишние пустые строки. А так да, модификатора s в sed нету. :(
В случае если он нужен, придётся подгружать строчки командой N, потом выводить P, и удалять хвосты D. Что конечно не очень удобно...
Где? Лишние не вставляются, просто сохраняются все уже существующие (вообще‐то, это моя недоработка: я забыл, что в данном случае perl отрабатывает построчно). Можно использовать

(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

Сообщение drBatty »

ZyX писал(а):
26.07.2011 22:15
Где?

$

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


ZyX писал(а):
26.07.2011 22:15
Можно использовать
perl -e '($_=join"",<>)=~s/\W+/\n/gs;print$_'

угу... вот так всегда...
ладно, не сегодня. моё выражение не оптимальное, дальше в книжке есть короче.
кстати, если можно всё грузить в память, то на сед тоже получается просто и легко (:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Программа на bash

Сообщение t.t »

Так интересно за вами наблюдать, господа. В любой теме, где встречаются drBatty и ZyX начинается очередной раунд perl vs sed, применимо к данной проблеме. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Программа на bash

Сообщение drBatty »

t.t писал(а):
28.07.2011 19:30
Так интересно за вами наблюдать, господа. В любой теме, где встречаются drBatty и ZyX начинается очередной раунд perl vs sed, применимо к данной проблеме. (:

всё потому, что
Типичная программа на Перле выглядит так, как будто программист бился головой об клавиатуру; и чаще всего оно так и есть

(:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Программа на bash

Сообщение sash-kan »

drBatty писал(а):
18.08.2011 15:57
всё потому, что
всё потому, что некоторые спорят о вкусах·
и временами это получается вкус тех самых устриц…
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: