Concaténation de fichiers+suppression entête

Fermé
misterblue Messages postés 6 Date d'inscription vendredi 18 avril 2008 Statut Membre Dernière intervention 16 avril 2015 - 27 oct. 2009 à 14:36
misterblue Messages postés 6 Date d'inscription vendredi 18 avril 2008 Statut Membre Dernière intervention 16 avril 2015 - 27 oct. 2009 à 18:02
Bonjour,
Sous le shell ksh.

J'aurais besoin de concaténer des fichiers textes plats .
Chaque fichier contient deux lignes d'en tête.
Mon besoin est de:
- supprimer la première ligne d'entête
- conserver la deuxième ligne d'en tête du premier fichier concaténé
- supprimer ces deux lignes d'entête pour les fichiers suivants concaténés

J'ai trouvé une solution (supposons que les fichiers à concaténer se nomment fichier_*.txt) :

#suppression des entêtes inutiles
tail +2 fichier_1.txt > fichier_1_tmp.txt
tail +3 fichier_2.txt > fichier_2_tmp.txt
tail +3 fichier_3.txt > fichier_3_tmp.txt
tail +3 ficheir_4.txt > fichier_4_tmp.txt
#concaténation vers un fichier final
cat fichier_1_tmp.txt fichier_2_tmp.txt fichier_3_tmp.txt fichier_4_tmp.txt > fichier_final.txt


Je trouve que c'est une solution consommatrice en resssources. Mais elle doit marcher.
(consommatrice en ressources parce qu'on passe deux fois sur chaques fichiers : une fois pour le tail, une fois pour le cat)

Par hasard, auriez-vous une autre solution efficace pour cette problématique ?

Merci par avance
A voir également:

6 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 oct. 2009 à 14:41
Salut,

tail +2 fichier_1.txt > fichier_final.txt 
for fic in $(ls fichier_[2-4].txt;do tail +3 $fic >>fichier_final;done
--
106485010510997108
0
Bonne soluce de lami20j !!! "fichier_final.txt" (manque le .txt)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
27 oct. 2009 à 15:40
Salut,

 ssh$ ls
fich1.txt  fich2.txt  fich3.txt  fich4.txt  fich5.txt

 ssh$ cat fich*
Entête 1
Entête 2
blablabla1
blablabllablabla
Entête 1
Entête 2
blablabla2
blablabllablabla
Entête 1
Entête 2
blablabla3
blablabllablabla
Entête 1
Entête 2
blablabla4
blablabllablabla
Entête 1
Entête 2
blablabla5
blablabllablabla

 ssh$ (sed '1d' fich1.txt && sed -s '1,2d' fich{2..5}.txt) > final.txt

 ssh$ cat final.txt
Entête 2
blablabla1
blablabllablabla
blablabla2
blablabllablabla
blablabla3
blablabllablabla
blablabla4
blablabllablabla
blablabla5
blablabllablabla

 ssh$

;-))
0
dubcek Messages postés 18753 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 7 novembre 2024 5 619
27 oct. 2009 à 15:43
hello
tu peux regrouper tes commandes entre () pour créer le fichier final
(tail +2 fichier_1.txt ; tail +3 fichier_2.txt ; tail +3 fichier_3.txt ; tail +3 fichier_4.txt ) > fichier_final.txt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 oct. 2009 à 17:15
Re,

Un peu moins d'écriture pour la solution de dubcek (que j'aime bien ;-)

(tail -q +2 fichier_1.txt;tail -q +3 fichier_[2-4].txt) > fichier_final.txt


Chez moi j'ai testé et j'ai une erreur si je n'utilise pas l'option -n

(tail -q -n +2 fichier_1.txt;tail -q -n +3 fichier_[2-4].txt) > fichier_final.txt
0
misterblue Messages postés 6 Date d'inscription vendredi 18 avril 2008 Statut Membre Dernière intervention 16 avril 2015
27 oct. 2009 à 18:02
merci à tous
Toutes vos solutions marchent et sont sympas
0