LINUX.ORG.RU

bash-скрипт на заполнение файла рандомными символами

 ,


1

1

Написал скрипт, который создает файл, заполняет его рандомными символами, после чего ищет слова с нужной буквой и записывает их в другой файл:

 #!/bin/bash
strings /dev/urandom | head -n2700000 | tr '\n' ' ' >> bgn.txt | grep -oE '\w*a\w*' bgn.txt | tr '\n' ' ' > fnh.txt 

Файл заполняется не только буквами, но и цифрами, различными символами (/!@#$%^&*_). При поиске нужных слов с данной буквой, в файл записываются «слова» по типу sA_n6, но без символов /!@#$%^&* . Почему?

Суть вопроса такова: как мне записывать в файл только англ. буквы с пробелами? Чтобы получались слова (рандомный набор букв некоторой длины, с двух сторон разделенный пробелами). Я пробовал так

tr -cd 'a-zA-Z'
, но буквы иду сплошняком, т.е. без пробелов.



Последнее исправление: cetjs2 (всего исправлений: 1)

head -c 1000 /dev/urandom | base64 | tr -c «0-9A-Za-z» " "

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от anonymous

Да,подходит. Выводит только буквы с пробелами. Спасибо :)

Только теперь другая проблема появилась: теперь не записывает найденные слова в другой файл. Раз через раз. Иногда записывает не все слова, иногда просто не записывает ни одно найденное слово. В чем может быть проблема?

newbieLX
() автор топика
Ответ на: комментарий от deadNightTiger

Тоже подходит. Но проблема частично осталась, с сохранением не всех слов.

newbieLX
() автор топика
Ответ на: комментарий от anonymous

Нет, я просто открывают эти 2 файла. Первый - заполнен символами, второй - тупо пустой.

Сейчас суть такая, что если через терминал сначала написать отдельно

head -n285000 /dev/urandom | tr -cd ' a-zA-Z' >> Em.txt
и после завершения написать отдельно вторую часть
grep -oE '\w*a\w*' Em.txt | tr '\n' ' ' > Eu.txt
, то создается и файл со словами и файл с найденными словами. Я попытался запусть скрипт из скрипта, все-равно не делает то, что нужно. Поискал что-нибудь о том, как можно притормозить вторую часть, пока первая не выполниться - но тоже не работает. Как можно решить данную проблему?

newbieLX
() автор топика
Ответ на: комментарий от newbieLX

не делает то, что нужно

А что нужно-то? Список слов из /dev/urandom, содержащие конкретную букву?

strings /dev/urandom | grep '^[a-zA-Z]*a[a-zA-Z]*$'
anonymous
()
import random,string
_=[1]*52
_[0]=_[26]=0
_=random.choices(string.ascii_letters,_,k=10)
_[random.randrange(10)]='a'
print(''.join(_))
anonymous
()
Ответ на: комментарий от anonymous

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

а если нарушаешь, то изволь встать и извиниться.

anonymous
()
Ответ на: комментарий от anonymous

По-любому нарушается, ведь ОПу нужна гарантированное наличие «a». Можно вместо 0 воткнуть 0.9 например.

anonymous
()
Ответ на: комментарий от anonymous

а почему 0.9? мне кажется правильнее будет добавлять букву 'a' к 9 случайным символам

from random import choices, randrange
from string import ascii_letters

word_length = 9

random_letters = choices(ascii_letters, k=word_length)
insert_position = randrange(len(random_letters))
random_letters.insert(insert_position, 'a')
word = ''.join(random_letters)
print(word)
anonymous
()

Решил эту задачу, но коряво.

Вот и корявый вариант

#!/bin/bash
head -n285000 /dev/urandom | tr -cd ' a-zA-Z' >> Em.txt | { sleep 10; grep -oE '\w*a\w*' Em.txt | tr '\n' ' ' > Eu.txt; }

newbieLX
() автор топика
Ответ на: комментарий от anonymous

правильнее будет добавлять букву 'a'

Правильнее - узнать какую вероятность и какое распределение надо ТСу с появлением этой буквы. Так что я считаю, что мой вариант: bash-скрипт на заполнение файла рандомными символами (комментарий) самый правильный, так как генерирует из белого шума только печатные символы через base64, а +/ - преобразуется в проблемы, что конечно не делает равномерным результат. А уж проверять пословно на «букву» уже совсем не сложно. Тут блин нагородили чёрте что, со sleep.

vodz ★★★★★
()
Ответ на: Решил эту задачу, но коряво. от newbieLX

да уж. так бы и сказал, что тебе оба файла нужны.

head -n285000 /dev/urandom | tr -cd ' a-zA-Z' >> Em.txt ; grep -oE '\w*a\w*' Em.txt | tr '\n' ' ' > Eu.txt
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.