J'ai un fichier texte et je veux supprimer des lignes aléatoires d'une plage. Voici un exemple:
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 4: mnop
Line 5: qrst
Line 6: uvwxyz
Sur ces six, je veux supprimer au hasard, par exemple, 3.
Comment y arriver? Ce serait bien s'il y avait une solution dans vim, donc on peut l'appliquer sur différentes gammes.
Voici une solution utilisant sed
:
sed -i $ ((début + RANDOM% intervalle)) d nomfichier.txt
où:
sed -i -Nd
indique à sed supprimer la ligne N du fichier d'entréeRANDOM
est le générateur de nombres aléatoires de bash; une variable shell spéciale qui contient un entier aléatoire compris entre 0 et 32767 lorsque vous l'utilisez.Ainsi, par exemple, pour supprimer une ligne aléatoire des lignes 90 à 120 du fichier test.txt, vous devez utiliser:
sed -i $ ((90 + RANDOM% 30)) d test.txt
Afin de supprimer plusieurs lignes aléatoires formant une plage spécifique dans le fichier texte, voici ce que j'ai fait:
Entrez la commande suivante:
.,/^\s*$/-1 !sed -e $((9 * $RANDOM / 32267))d
. - D'ici
,/^\s * $/- 1 - Jusqu'à la dernière ligne non vide
! sed -e $ ((9 * $ RANDOM/32267)) d - la commande sed pour supprimer une ligne aléatoire
Cela supprimera une ligne au hasard.
Maintenant, si vous voulez supprimer 5 autres lignes aléatoires, il suffit de faire 5 @: et vim fait le reste.
Cela peut être encore amélioré si je peux remplacer ce 9 (nombre de lignes à supprimer) par une expression qui sera universelle
C'est aussi possible avec python
:
bash-4.3$ python -c 'import sys,random;lines=sys.stdin.readlines();lines.pop(random.randint(0,len(lines)-1));print "".join(lines)' < input.txt
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 5: qrst
Line 6: uvwxyz
Le processus est simple: nous redirigeons le fichier d'entrée dans le fichier stdin
de python et lisons toutes les lignes dans une liste. Ensuite, nous sélectionnons des index de ligne aléatoires via la fonction random.randint()
dans la plage de tous les index de la liste, de l'index 0 au dernier index (c'est ce que fait len(lines)-1
.). Cet index est supprimé de la liste via lines.pop()
et nous imprimons ensuite le texte réassemblé. Assez facile
Utilisez la commande suivante
:nd
où n est le numéro de la ligne.