web-dev-qa-db-fra.com

Comment puis-je supprimer une ligne aléatoire dans un fichier texte d'une plage donnée?

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.

5
deshmukh

Voici une solution utilisant sed:

sed -i $ ((début + RANDOM% intervalle)) d nomfichier.txt

où:

  • start est le numéro de la ligne de début de votre plage
  • plage (ou fin-début est le nombre de lignes à inclure à partir de début)
  • sed -i -Nd indique à sed supprimer la ligne N du fichier d'entrée
  • RANDOM 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
7
ish

Afin de supprimer plusieurs lignes aléatoires formant une plage spécifique dans le fichier texte, voici ce que j'ai fait:

  • Ouvrez le fichier dans vim
  • Allez en haut de la plage à partir de laquelle vous souhaitez supprimer plusieurs lignes aléatoires. La plage doit avoir une ligne vide en bas
  • 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

1
deshmukh

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

0
Sergiy Kolodyazhnyy

Utilisez la commande suivante

:nd

où n est le numéro de la ligne.

0
James