#1 Le 06/11/2012, à 10: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, à 11: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 - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#3 Le 06/11/2012, à 11: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, à 11:12)
Hors ligne
#4 Le 06/11/2012, à 11: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, à 11:17
- tauraduboudin
Re : suppression lignes fichiers
Ah merci pingouin, une bonne source d'inspiration !
Merci encore !
Hors ligne
#6 Le 06/11/2012, à 11: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, à 11:22)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#7 Le 06/11/2012, à 11: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, à 11:30)
Hors ligne
#8 Le 06/11/2012, à 11: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