Я пытаюсь добавить случайную строку для каждой строки во время работы:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
Перед этим генерируется случайная строка:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
Проблема в том, что он напечатает одну и ту же случайную строку для каждой строки:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
Что я должен сделать, чтобы получить разные случайные строки для каждой строки?
tr -dc '[:alnum:]' </dev/urandom | head -c 6
, он будет проще и вычислительнее эффективнее в использованииpwgen -s 6 1
, а еще лучшеpwgen -s 6 $(wc -l myfile)
, даст вам все нужные вам случайные строки за один выстрел.Ответы:
С функцией awk
system()
:Образец
input.txt
:Пример вывода:
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
источник
tr: write error: Broken pipe
?Тебе не кажется, что это немного очевидно? Вы просто генерируете случайную строку один раз, сохраняете ее в
ran
переменной и используете для всех строк!Использование
getline
в переменную из трубыКогда вы используете
command | getline var
, выходные данные команды отправляются через каналgetline()
в переменнуюvar
.Также обратите внимание, что когда канал открыт для вывода,
awk
запоминает команду, связанную с ним, и последующие записи в команду добавляются к предыдущим записям. Нам нужно сделать явныйclose()
вызов команды, чтобы предотвратить это.Если вложенные одинарные кавычки в
str_generator
являются причиной проблемы, замените ее восьмеричным эквивалентом (\047
)источник
Запуск одного экземпляра для
tr -dc '[:alnum:]' </dev/urandom | head -c 6
каждой строки ввода будет контрпродуктивным, лучше сделать:Если ваш ввод не содержит обратных кавычек или одинарных кавычек, вы также можете использовать
m4
smkstemp()
:источник
Эта вариация на пару других ответов делает случайную генерацию строк вне
awk
:tr
+fold
Конвейер генерирует бесконечный поток случайных строк из шести символов на стандартном вводеawk
.awk
будет игнорировать стандартный ввод, если указано имя файла, поэтому эти случайные строки считываютсяgetline
из/dev/stdin
переменнойr
.printf
затем используется для префикса строк из файла с соответствующей строкой.Учитывая файл
это может привести к
источник
Вообще без использования awk, просто
bash
источник
Требования - input.txt должен содержать только один столбец, другими словами, он не должен иметь табуляции или пробелов, потому что они используются в качестве разделителя по умолчанию командами
awk
иpaste
(только символ табуляции). В противном случае команда должна быть немного изменена.Примечание: Base64 алфавит содержит
+
и/
символы: Base64 таблицы , если вы хотите только цифры и буквы, вы можете использоватьbase32
команду - base32 алфавит .вход
===
символы добавлены для ясности.Выход
источник