Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#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)


Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXe siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

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)

En 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)


Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXe siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

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)

En 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

Haut de page ↑