Concaténation de fichiers+suppression entête

misterblue Messages postés 7 Statut Membre -  
misterblue Messages postés 7 Statut Membre -
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

6 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. callmeal
     
    Bonne soluce de lami20j !!! "fichier_final.txt" (manque le .txt)
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  7. misterblue Messages postés 7 Statut Membre
     
    merci à tous
    Toutes vos solutions marchent et sont sympas
    0