Заполнение столбца текстового файла со случайными данными с помощью удара

У меня есть файл с форматом

<string> <string> <string>
..
..

Я пытаюсь заменить третью строку столбца случайными данными с помощью sed. Третья длина строки столбца фиксируется и является 48 цифрами

Я смог согласовать чтение использования решения

while read a b c; do
    echo $a $b $(cat /dev/urandom | tr -dc '0-1' | fold -w 48 | head -n 1)
done < input > output

Однако цикл занимает слишком много времени также процесс. Как я могу сделать это с sed.

2
задан 6 December 2016 в 06:38

2 ответа

cat /dev/urandom | tr -dc '0-1' - ужасно медленный способ получения случайных чисел - вы отбрасываете много данных только потому, что они не разбираются в число ASCII.

Вы можете использовать od или hexdump для преобразования данных в числа, вместо этого, возможно, awk для замены третьего поля:

$ awk -v cmd="od -t u2 -A n /dev/urandom | tr -d ' \n' | fold -w 48" '{cmd | getline a; $3=a}1' foo
a b 544404963198532458179603539139474299576034345258
a b 288743886427692659230387417952036728563243415446
a b 862132599821016414678116482868514114597223157825
a b 033164829235119519053106724136729063192651002644
a b 344594724128550250448115260033862902855932105599
a b 312488113115218631189450762993316672549312384472
a b 536218132619476215470461793189974621744028599402
a b 312943765306550325469516346331872556359574159859
a b 530561655804530239462031928466172515137971221356
a b 295271911741933346066441964722122556255551414840

od -t u2 -A n /dev/urandom | tr -d ' \n' | fold -w 48 преобразует случайные данные в два -байт unsigned int с, затем мы используем tr для удаления пробелов из вывода od.

awk очень хорош для обработки текста на основе столбцов. Метод <command> | getline позволяет вам запустить <command> один раз и затем прочитать его выходные данные во время выполнения команды awk.

Более простой способ, чем приведение вывода od к требуемому формату, заключается в использовании hexdump:

hexdump -e '"%u"' /dev/urandom | fold -w 48
5
ответ дан 2 December 2019 в 01:32

Используя Байты жемчуга:: Случайный:: Безопасный модуль:

$ perl -MBytes::Random::Secure=random_bytes_hex -alne '
  print join " ", @F[1..2], random_bytes_hex(24)
' file
<string> <string> 56fe375ade090e9838c13b5bbb799c2fac26d42da3f01691
<string> <string> 8bf748fb4d372e701af5ae0075a9de58c8ce3b05210c24bd
<string> <string> 345c58a5983e7bade8fed0311267daeea9ed314b1efe33d1

Модуль доступен в Ubuntu через пакет libbytes-random-secure-perl

3
ответ дан 2 December 2019 в 01:32

Другие вопросы по тегам:

Похожие вопросы: