Forum Programmation.shell Éliminer des lignes dans un fichier à ski...

Posté par  .
Étiquettes : aucune
0
6
juil.
2006
Bonjour,
J'ai un fichier ascii à imprimer, en mode raw sur une imprimante.
Ça, je sais faire. Le problème, c'est que ce fichier comporte 84 pages d'éditions sur 66 lignes, et qu'un certain nombre d'informations ne sont pas placées au bon endroit.
Je recherche donc la commande magique qui me permettrait d'enlever 3 lignes par pages.
Pour être plus clair, il me faudrait un script qui m'enlève les lignes 57, 58, 59, puis les lignes 123,124, 125, etc jusqu'à la fin du fichier.
Si vous avez une idée, je cherche de mon côté en attendant....
  • # head et tail

    Posté par  . Évalué à 1.

    En combinant les commandes head et tail, tu dois pouvoir sélectionner les lignes à enlever.
  • # Ca doit être bon

    Posté par  . Évalué à 3.

    Je pense avoir trouvé. Je suppose qu'il y a beaucoup plus simple mais il semble que ça marche. Teste ce script perl :

    #!/usr/bin/perl

    my $orig_file  = "mon_fichier";
    my $new_file   = "mon_nouveau_fichier";
    my @all_lines  = `cat $orig_file`;
    my $first_skip = 57;
    my $n_skip     = 3;
    my $i          = 1;


    chomp(@all_lines);
    for(my $j=0; $j<scalar(@all_lines); $j++) {

        if($i == $first_skip) {
            $i = 1;
            $j += $n_skip-1;
            next;
        }
        
        `echo $all_lines[$j] >> $new_file`;
        $i++;
    }

    Sur le principe ça semble bon... par contre en ce qui concerne l'écriture du nouveau fichier... Si tu as des caractères non alpha (apostrophe, quote, etc) je te conseille d'utiliser les mécanismes perl pour écrire la ligne (open, close, etc).
  • # avec awk

    Posté par  (site web personnel) . Évalué à 7.

    awk '{if(NR%66 < 57 || NR%66 >59) {print $0}}'
  • # un peu de shell et de sed...

    Posté par  (site web personnel) . Évalué à 4.


    #! /bin/sh
    begline=57
    endline=59
    pagesize=66
    pagecount=84
    action="d"

    # Creation du fichier de script sed
    > sedscriptfile

    for page in $(seq 0 $pagecount)
    do
    let "pagebegline=begline + page * pagesize"
    let "pageendline=endline + page * pagesize"
    echo "$pagebegline,$pageendline$action" >> sedscriptfile
    done


    ce script te génère la liste des action à effectuer pour une commande sed dans le fichier sedscriptfile. Par exemple "57,59d" indique de supprimer les ligne 57 à 59.

    Un simple sed -f sedscriptfile nom_de_ton_fichier > nouveau_fichier fera ensuite l'affaire... A ton service ;-)
  • # Merci @ tous !

    Posté par  . Évalué à 3.

    Finalement, le libre, c'est bien TM, car ça laisse plein de choix.
    Comme je suis informaticien, et donc feignant (ou le contraire, je ne sais plus), je me suis orienté vers la commande awk proposée par Pascal Terjan.
    C'est parfait. Il ne me reste qu'à vous remercier tous.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.