Je souhaite supprimer 10 lignes aléatoires d'un fichier texte de 90 lignes, puis le sortir dans un nouveau fichier. J'ai essayé de le faire en utilisant sed, mais j'ai deux problèmes. J'utilise :
sed -i $((1 + RANDOM & 90))d input.txt > output.txt
puis en exécutant la commande 10 fois (je suppose qu'il existe une meilleure façon de procéder !)
Le premier problème que j'ai est que j'obtiens l'erreur :
sed :-e expression #1, char 2 :utilisation incorrecte de l'adresse de ligne 0
Je suppose que cela a quelque chose à voir avec le fait qu'il a peut-être déjà supprimé la ligne 1 et qu'il essaie à nouveau.
Le deuxième problème est que parfois rien n'est écrit dans le fichier de sortie, même si cela fonctionnait avant d'utiliser la même commande.
Réponse acceptée :
Vous vouliez probablement utiliser RANDOM % 90
plutôt que &
. C'est de là que viennent les zéros (supprimer la ligne 1 est OK, à la prochaine exécution, les lignes seront numérotées 1 .. 89).
Il y a cependant un problème :la formule peut générer plusieurs fois le même nombre. Pour éviter cela, utilisez une approche différente :mélangez les nombres et choisissez les dix premiers :
shuf -i1-90 -n10 | sed 's/$/d/' | sed -f- input > output
Si vous n'aimez pas sed
générer un sed
script, vous pouvez utiliser printf
, aussi :
sed -f <( printf %dd; $(shuf -i1-90 -n10) ) input > output