Wie kann ich bestimmte Zeichenfolgen in einer Textdatei zufällig durch Zeichenfolgen aus einer anderen Datei ersetzen? Zum Beispiel:
file1.txt(file has more than 200 lines):
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
file2.txt(file has 10-20 lines):
@adress1.com
@adress2.com
@adress3.com
@adress4.com
@adress5.com
output.txt:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
command-line
text-processing
elanozturk
quelle
quelle
Antworten:
Wenn Sie wirklich eine zufällige Auswahl wünschen, haben Sie folgende Möglichkeiten
awk
:OTOH, wenn Sie eine zufällige Permutation der Adressen wünschen, würde ich so etwas vorschlagen
quelle
paste
aber es kam mir nicht incut
den Sinn, das nicht übereinstimmende Feld zu entfernen.<(sort -R file2.txt)
können wir so etwas wie verwenden<(yes "$(<file2.txt)" | head -n $(wc -l < file1.txt) | sort -R)
- das kann die Zufälligkeit zugunsten von Zeilen verzerren, die näher am oberen Rand von Datei2 liegen.Sie könnten diesen Algorithmus implementieren:
file2.txt
in ein Arrayfile1.txt
:So was:
(Besonderer Dank geht an @GlennJackman und @dessert für die Verbesserungen.)
quelle
mapfile -t addresses < file2.txt
-cat
wenn Sie dies verwenden , werden Sie einer Wortaufteilung und einer Dateinamenerweiterung unterzogen.file1.txt
wenn diese Datei nicht mit einer leeren Zeile endet (leider kann ich sie derzeit nicht testen)? Wenn nicht, empfehle ichwhile IFS='' read -r orig || [[ -n "$orig" ]]; do
, Zeile zeilenweise lesen und einer Variablen den Wert · SO zuweisen .Sie können
shuf
(möglicherweise müssensudo apt install shuf
) verwenden, um die Zeilen der zweiten Datei zu mischen und sie dann zu ersetzen:shuf
randomisiert einfach die Reihenfolge seiner Eingabezeilen. Derawk
Befehl dort liest zuerst die gesamte Datei1 (NR==FNR
ist nur wahr, während die erste Datei gelesen wird) und speichert das zweite Feld (Felder werden durch definiert@
, dies ist also die Domäne) im assoziativen Array,a
dessen Werte die Domänen und sind deren Schlüssel sind die Zeilennummern. Wenn wir dann zur nächsten Datei gelangen, wird einfach alles gedruckt, wasa
für diese Zeilennummer gespeichert wurde , zusammen mit dem, was in Datei 2 für dieselbe Zeilennummer enthalten ist.Beachten Sie, dass dies voraussetzt, dass beide Dateien genau die gleiche Anzahl von Zeilen haben und nicht "zufällig" sind, da dadurch nichts wiederholt werden kann. Aber das sieht so aus, als wollten Sie danach fragen.
quelle
Python 2.7 und 3 Lösung
Diese Lösung ersetzt das erste Auftreten einer einzelnen beliebigen Zeichenfolge (die „Nadel“) in jeder Zeile der Eingabedatei durch eine Zeichenfolge, die jedes Mal zufällig aus dem Satz von Zeilen der Liste der Ersetzungszeichenfolgen ausgewählt wird.
Es sollte fast trivial sein, die Nadel am Anfang oder Ende der Schnur zu verankern oder reguläre Ausdrücke insgesamt zu verwenden.
Verwendungszweck
Beispiel:
oder
quelle
Hier ist ein Perl-Weg:
quelle
Eine andere Bash-Lösung. Es verwendet die in Bash integrierte Funktion zum Ersetzen von Zeichenfolgen. Es wird auch davon
file2.txt
ausgegangen, dass nur die Ersatzzeichenfolgen enthalten sind. Wenn nicht, können sie zuerst mit gefiltert werdengrep -o <replace> file2.txt
Mit
shuf
Ohne
shuf
(fast reinbash
)Hier müssen wir eine Funktion erstellen Sie zuerst , dass ahmt
shuf
so gerneDann ist es ähnlich
Prüfung:
quelle