Ich versuche, zufällige Zeichenfolge für jede Zeile beim Ausführen hinzuzufügen:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
Vorher wird der Zufallsstring generiert:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
Das Problem ist, dass für jede Zeile dieselbe zufällige Zeichenfolge ausgegeben wird:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
Was kann ich tun, um für jede Zeile eine andere zufällige Zeichenfolge zu erhalten?
tr -dc '[:alnum:]' </dev/urandom | head -c 6
, wäre es einfacher und rechnerisch effizienterpwgen -s 6 1
, oder besserpwgen -s 6 $(wc -l myfile)
, Sie erhalten genau alle zufälligen Zeichenfolgen, die Sie benötigen, auf einen Schlag.Antworten:
Mit awk-
system()
Funktion:Probe
input.txt
:Beispielausgabe:
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
quelle
tr: write error: Broken pipe
?Findest du das nicht ein bisschen offensichtlich? Sie generieren nur eine zufällige Zeichenfolge und speichern sie in einer
ran
Variablen und verwenden sie für alle Zeilen!Verwendung
getline
in eine Variable aus einer PipeWenn Sie verwenden
command | getline var
, wird die Ausgabe des Befehls über eine Pipe angetline()
und in die Variable gesendetvar
.Beachten Sie auch, dass beim Öffnen einer Pipe für die Ausgabe
awk
der zugehörige Befehl gespeichert und nachfolgende Schreibvorgänge an die vorherigen Schreibvorgänge angehängt werden. Wir müssenclose()
den Befehl explizit aufrufen, um dies zu verhindern.Wenn die verschachtelten einfachen Anführungszeichen in den
str_generator
ein Problem verursachen, ersetzen Sie sie durch das entsprechende Oktal (\047
).quelle
Das Ausführen einer Instanz von
tr -dc '[:alnum:]' </dev/urandom | head -c 6
pro Eingabezeile wäre kontraproduktiv. Am besten tun Sie Folgendes:Wenn Sie Ihre Eingabe enthält keine Backticks noch einfache Anführungszeichen, können Sie auch nutzen
m4
‚smkstemp()
:quelle
Diese Variation einiger anderer Antworten bewirkt die Zufallsgenerierung von Zeichenfolgen außerhalb von
awk
:Die
tr
+fold
-Pipeline generiert bei der Standardeingabe von einen endlosen Strom zufälliger sechsstelliger Zeichenfolgenawk
.awk
ignoriert die Standardeingabe, wenn ein Dateiname angegeben wird, sodass diese zufälligen Zeichenfolgengetline
von/dev/stdin
in die Variable eingelesen werdenr
.printf
wird dann verwendet, um den Zeilen aus der Datei den entsprechenden String voranzustellen.Angesichts der Datei
dies kann produzieren
quelle
Ganz ohne awk, ganz einfach
bash
quelle
Anforderungen - Die Datei input.txt sollte nur eine Spalte enthalten, dh keine Tabulatoren oder Leerzeichen enthalten, da sie als Standardtrennzeichen für die Befehle
awk
undpaste
(nur Tabulatorzeichen) verwendet werden. Andernfalls muss der Befehl ein wenig geändert werden.Hinweis: Das Base64- Alphabet enthält
+
und/
Zeichen: Base64-Tabelle . Wenn Sie nur Zahlen und Buchstaben möchten, können Sie denbase32
Befehl " Base32-Alphabet" verwenden .Eingang
===
Zeichen zur Verdeutlichung hinzugefügt.Ausgabe
quelle