#1 Le 06/11/2012, à 10:51
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
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 XXème 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, à 11:08
Re : suppression lignes fichiers
Bonjour,
Plus simple :
for i in {100100..1..1001}; do sed -i "${i}d" fichier;doneCorrection
Dernière modification par pingouinux (Le 06/11/2012, à 11:12)
En ligne
#4 Le 06/11/2012, à 11:11
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_fichierMais 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
Re : suppression lignes fichiers
Ah merci pingouin, une bonne source d'inspiration !
Merci encore !
Hors ligne
#6 Le 06/11/2012, à 11:19
Re : suppression lignes fichiers
Dans ce cas :
grep -v 'ligne_répétée' ancien_fichier > nouveau_fichiergrep = 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_fichierSi 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-Munch - administrateur Linux depuis le XXème 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, à 11:27
Re : suppression lignes fichiers
Autre solution, simple et très rapide :
awk 'NR%1001{print}' fichier >fichier_modifieou même
awk 'NR%1001' fichier >fichier_modifieDernière modification par pingouinux (Le 06/11/2012, à 11:30)
En ligne
#8 Le 06/11/2012, à 11:45
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
Pages : 1
- Accueil
- » Forum
- » Terminal, scripts et ligne de commande
- » suppression lignes fichiers