Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/11/2012, à 09:51

tauraduboudin

suppression lignes fichiers

Bonjour,
je cherche à supprimer des lignes intervenant de manière régulière dans un tas de (gros) fichiers. Plus précisemment, toutes les mille et une lignes.
Etant nul en shell, je suis passé par R pour automatiser une exécution de 'sed' comme ceci :

#le fichier cible fait 100100 lignes au lieu de 100000 à cause de l'insertion d'un élément régulièrement répété dans le fichier
x=seq(from=1, to=100100, by=1001)

#afin de garder la premier ligne (qui est l'élément répété), puis en inversant l'ordre des éléments du vecteur 'x'
x=x[length(x):1][1:(length(x)-1)]

#exécution de 'sed' en boucle
for(i in x){system(paste("sed '", i,"d' fichier_a_modifier", sep=""))}

Mon Problème est que c'est incroyablement long, et suis convaincu qu'il y a probablement plus rapide.
Avez vous des suggestions par hasard ?
C.

Hors ligne

#2 Le 06/11/2012, à 10:06

tiramiseb

Re : suppression lignes fichiers

Ces lignes à supprimer n'ont-elles pas un contenu spécifique, propre à elles-mêmes, qui permette de les identifier facilement parmi l'ensemble du fichier ? (ce serait vaaachement plus facile à faire)

Hors ligne

#3 Le 06/11/2012, à 10:08

pingouinux

Re : suppression lignes fichiers

Bonjour,
Plus simple :

for i in {100100..1..1001}; do sed -i "${i}d" fichier;done

Correction

Dernière modification par pingouinux (Le 06/11/2012, à 10:12)

Hors ligne

#4 Le 06/11/2012, à 10:11

tauraduboudin

Re : suppression lignes fichiers

ah, oui, ce sont exactement les mêmes !

J'ai tenté un

 sed '/ligne_répétée/d' ancien_fichier >nouveau_fichier

Mais j'aimerai garder la toute première ligne pour éliminer seulement les 999 répétitions au milieu du fichier.

Hors ligne

#5 Le 06/11/2012, à 10:17

tauraduboudin

Re : suppression lignes fichiers

Ah merci pingouin, une bonne source d'inspiration !
Merci encore !

Hors ligne

#6 Le 06/11/2012, à 10:19

tiramiseb

Re : suppression lignes fichiers

Dans ce cas :

grep -v 'ligne_répétée' ancien_fichier > nouveau_fichier

grep = rechercher des lignes
-v = retourner les lignes qui ne correspondent pas à la chaîne indiquée

La logique n'est ici pas de "supprimer" les lignes que tu connais, mais de *conserver* celles que tu n'indiques pas :-)

Et c'est vachement rapide :-)

----

Désolé, je n'avais pas vu que tu voulais en garder la première occurrence. Si son emplacement n'a pas d'importance, tu peux faire :

echo 'ligne_répétée' > nouveau_fichier
grep -v 'ligne_répétée' ancien_fichier >> nouveau_fichier

Si tu souhaites garder la première ligne dans son emplacement original, alors je ne vois pas de solution mieux que celle de pingouinux.

Dernière modification par tiramiseb (Le 06/11/2012, à 10:22)

Hors ligne

#7 Le 06/11/2012, à 10:27

pingouinux

Re : suppression lignes fichiers

Autre solution, simple et très rapide :

awk 'NR%1001{print}' fichier >fichier_modifie

ou même

awk 'NR%1001' fichier >fichier_modifie

Dernière modification par pingouinux (Le 06/11/2012, à 10:30)

Hors ligne

#8 Le 06/11/2012, à 10:45

tauraduboudin

Re : suppression lignes fichiers

Merci pour vos idées, je vais abandonner l'idée de garder la première ligne dans un premier temps. Dans un second temps je vais débugguer mon programme pour qu'il arrêtre de la répéter.
Merci encore !

Hors ligne