Comment remplacer au hasard des chaînes spécifiques dans un fichier texte par des chaînes d'un autre fichier? Par exemple:
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
la source
la source
Réponses:
Si vous voulez vraiment une sélection aléatoire, voici une façon d'utiliser
awk
:OTOH si vous voulez une permutation aléatoire des adresses, je suggère quelque chose comme
la source
paste
mais je n'ai pas pensé à utilisercut
pour supprimer le champ non correspondant.<(sort -R file2.txt)
nous pouvons utiliser quelque chose comme<(yes "$(<file2.txt)" | head -n $(wc -l < file1.txt) | sort -R)
- cela peut fausser le caractère aléatoire en faveur de lignes plus proches du haut du fichier2.Vous pouvez implémenter cet algorithme:
file2.txt
dans un tableaufile1.txt
:Comme ça:
(Un merci spécial à @GlennJackman et @dessert pour les améliorations.)
la source
mapfile -t addresses < file2.txt
- en utilisantcat
comme cela vous soumet au fractionnement de mots et à l'expansion du nom de fichier.file1.txt
si ce fichier ne se termine pas par une ligne vide (désolé, impossible de tester pour le moment)? Sinon, je recommandewhile IFS='' read -r orig || [[ -n "$orig" ]]; do
, voir Lire un fichier ligne par ligne en attribuant la valeur à une variable · SO .Vous pouvez utiliser
shuf
(vous devrez peut-êtresudo apt install shuf
) pour mélanger les lignes du deuxième fichier, puis les utiliser pour remplacer:shuf
randomise simplement l'ordre de ses lignes d'entrée. Laawk
commande y lira d'abord tout le fichier1 (NR==FNR
ne sera vraie que pendant la lecture du premier fichier) et enregistre le deuxième champ (les champs sont définis par@
, c'est donc le domaine) dans le tableau associatifa
dont les valeurs sont les domaines et dont les clés sont les numéros de ligne. Ensuite, lorsque nous arrivons au fichier suivant, il imprimera simplement tout ce qui a été stockéa
pour ce numéro de ligne, ainsi que ce qui se trouve dans le fichier 2 pour le même numéro de ligne.Notez que cela suppose que les deux fichiers ont exactement le même nombre de lignes et ne sont pas réellement "aléatoires", car cela ne permettra rien de se répéter. Mais cela ressemble à ce que vous vouliez demander.
la source
Solution Python 2.7 et 3
Cette solution remplace la première occurrence d'une seule chaîne donnée arbitraire («l'aiguille») dans chaque ligne du fichier d'entrée par une chaîne à chaque fois choisie aléatoirement dans l'ensemble des lignes de la liste des chaînes de remplacement.
Il devrait être presque trivial d'ancrer l'aiguille au début ou à la fin de la chaîne ou d'utiliser des expressions régulières.
Usage
Exemple:
ou
la source
Voici un moyen perl:
la source
Une autre solution bash. Il utilise la fonction de remplacement de chaîne intégrée bash. Il suppose également que
file2.txt
contient uniquement les chaînes de remplacement. Sinon, ils peuvent d'abord être filtrés à l'aide degrep -o <replace> file2.txt
Avec
shuf
Sans
shuf
(presque purbash
)Ici, nous devons d'abord créer une fonction qui imite
shuf
commeAlors c'est pareil
Tester:
la source