J'essaie d'ajouter une chaîne aléatoire pour chaque ligne lors de l'exécution:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
Avant cela, la chaîne aléatoire est générée:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
Le problème est qu'il affichera la même chaîne aléatoire pour chaque ligne:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
Que dois-je faire pour obtenir une chaîne aléatoire différente pour chaque ligne?
tr -dc '[:alnum:]' </dev/urandom | head -c 6
, il serait plus simple et plus efficace à utiliserpwgen -s 6 1
, ou mieux encorepwgen -s 6 $(wc -l myfile)
vous donnerait exactement toutes les chaînes aléatoires dont vous avez besoin, en une seule fois.Réponses:
Avec la fonction awk
system()
:Échantillon
input.txt
:Exemple de sortie:
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
la source
tr: write error: Broken pipe
?Ne pensez-vous pas que c'est un peu évident? Vous générez juste une chaîne aléatoire une fois et la stockez dans une
ran
variable et l'utilisez pour toutes les lignes!Utilisation
getline
dans une variable d'un tuyauLorsque vous utilisez
command | getline var
, la sortie de la commande est envoyée via un canal versgetline()
et dans la variablevar
.Notez également qu'un canal ouvert pour la sortie se
awk
souvient de la commande qui lui est associée et que les écritures suivantes sur la commande sont ajoutées aux écritures précédentes. Nous devonsclose()
appeler explicitement la commande pour éviter cela.Si les guillemets simples imbriqués dans le
str_generator
sont à l'origine d'un problème, remplacez-le par son équivalent octal (\047
)la source
L'exécution d'une instance de
tr -dc '[:alnum:]' </dev/urandom | head -c 6
par ligne d'entrée serait contre-productive, vous feriez mieux de le faire:Si votre entrée ne contient pas ni guillemets simples guillemets obliques, vous pouvez aussi utiliser
m4
l »mkstemp()
:la source
Cette variation sur quelques autres réponses fait la génération de chaînes aléatoires en dehors de
awk
:Le pipeline
tr
+fold
génère un flux sans fin de chaînes aléatoires de six caractères sur l'entrée standard deawk
.awk
ignorera l'entrée standard si un nom de fichier est fourni, donc ces chaînes aléatoires sont lues pargetline
from/dev/stdin
dans la variabler
.printf
est ensuite utilisé pour préfixer les lignes du fichier avec la chaîne appropriée.Compte tenu du dossier
cela peut produire
la source
Sans utiliser awk du tout, c'est simple
bash
la source
Exigences - le fichier input.txt ne doit contenir qu'une seule colonne, en d'autres termes, il ne doit pas avoir de tabulations ou d'espaces, car ils sont utilisés comme séparateur par défaut par les commandes
awk
etpaste
(uniquement les caractères de tabulation). Sinon, la commande doit être modifiée un peu.Remarque: L' alphabet Base64 contient
+
et des/
caractères: Tableau Base64 , si vous ne voulez que des chiffres et des lettres, vous pouvez utiliser labase32
commande - Alphabet Base32 .Contribution
===
caractères ajoutés pour plus de clarté.Production
la source