IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Supprimer les deux derniers caractères de chaque ligne d'un fichier


Sujet :

Linux

  1. #1
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Supprimer les deux derniers caractères de chaque ligne d'un fichier
    Bonjour à tous,

    Voici mon soucis, j'ai un fichier sous fc5 et je voudrais par une commande simple supprimer les deux derniers caractères de chaque ligne de mon fichier.

    Je vous remercie par avance

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Je crois que sed pourra être utile, le tout étant de formaliser une expression régulière englobant les deux derniers caractères d'une ligne.

    Pour t'aider, comme d'habitude : man sed et man re_format. Pour la deuxième page, dans le cas où elle ne serait pas dans les man de ta distribution, consulte là ici : http://www.openbsd.org/cgi-bin/man.c...86&format=html

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par DragVinny
    Bonjour à tous,

    Voici mon soucis, j'ai un fichier sous fc5 et je voudrais par une commande simple supprimer les deux derniers caractères de chaque ligne de mon fichier.

    Je vous remercie par avance
    j'aime bien Ruby pour ce genre de snippet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/usr/bin/env ruby
     
    begin
    	file = File.new( ARGV[0], "r" )
    rescue
    	file = STDIN
    end
     
    while line = file.gets
          # -3  to take the \n into account...
    	puts line[0,line.length-3]
    end
    (l'idéal serait de passer la longueur à stripper en argument…)

  4. #4
    Membre confirmé Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Points : 509
    Points
    509
    Par défaut
    Si chaque ligne à une longueur différente tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/usr/bin/sh
    while read ligne
    do
            longueur=`echo $ligne|wc -m`
            num=`echo $(( $longueur - 2 ))`
            echo $ligne|cut -c1-$num >> fic_dest
    done < test1.txt
    Si chaque ligne à la même longueur un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cut -c-1-$num mon_fichier >> fic_dest

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par herzleid
    Si chaque ligne à une longueur différente tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/usr/bin/sh
    while read ligne
    do
            longueur=`echo $ligne|wc -m`
            num=`echo $(( $longueur - 2 ))`
            echo $ligne|cut -c1-$num >> fic_dest
    done < test1.txt
    Si chaque ligne à la même longueur un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cut -c-1-$num mon_fichier >> fic_dest
    oui cela fonctionnera sans doute aussi,

    mais quand on remarque que echo et cut sont des exécutables à part entière et non des commandes internes du shell…
    (/bin/echo et /usr/bin/cut)
    on peut s'interroger : lancer 4 process à chaque ligne du fichier source traité : n'est-ce pas un "peu" lourd ?

  6. #6
    Membre confirmé Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Points : 509
    Points
    509
    Par défaut
    Faut faire le test. QUi est le plus rapide ? L'appel à echo et à cut ou à l'interpréteur rubis ?

    Les paris (troll) sont ouverts. DragVinny oublis pas de précéder les commandes d'un time que l'on puisse avoir la conclusion de ce thriller :p

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par herzleid
    Faut faire le test. QUi est le plus rapide ? L'appel à echo et à cut ou à l'interpréteur rubis ?

    Les paris (troll) sont ouverts. DragVinny oublis pas de précéder les commandes d'un time que l'on puisse avoir la conclusion de ce thriller :p
    Ben moi je parie sur sed....

    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre confirmé Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Points : 509
    Points
    509
    Par défaut
    Citation Envoyé par souviron34
    Ben moi je parie sur sed....

    Ok je prends le paris (j'ai aucun doute surt ta victoire mais je défendrai mon poulain jusqu'au bout)


    Mais pour jour faut fournir le shell. Pas de shell, pas de concour



    Je sais je suis sans coeur.

  9. #9
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Allez, sed est mon ami :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\(.*\)..$/\1/' fichier
    En plus, c'est court

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par herzleid
    Ok je prends le paris (j'ai aucun doute surt ta victoire mais je défendrai mon poulain jusqu'au bout)


    Mais pour jour faut fournir le shell. Pas de shell, pas de concour



    Je sais je suis sans coeur.
    encore faudrait-il que l'exemple avec echo et cut fonctionne…
    ce qui n'est pas le cas …
    car lorsqu'on traite des fichiers quelconques on peut avoir des lignes dont la longueur est 2 et $num est alors négatif, résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cut: [-cf] list: illegal list value
    comparaison des 2 sur la partie webapp d'un site web (tous les fichiers php)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    time find . -name "*.php" -exec cutlines.rb -e 2 {} \; > /dev/null
     
    real    0m11.065s
    user    0m6.889s
    sys     0m3.454s
    le code Ruby :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #!/opt/local/bin/ruby
     
    require 'optparse'
     
    class CatArguments < Hash
    	def initialize(args)
     		super()
    		self[:begin] = 0
    		self[:end] = 0
    		self[:reverse] = false
     
    		opts = OptionParser.new do |opts|
    			opts.banner = "Usage: #$0 [options] [file]\nExamples:\n\t#$0 -e 2 filename\n\tcat filename | #$0 -b 2 -e 2 -r"
     
    			opts.on('-b', '--begin [INTEGER]', 'number of chars to strip at start of line, default = 0') do |string|
    				self[:begin] = string.to_i || 0
    				self[:begin] = 0 if self[:begin] < 0
    			end
     
    			opts.on('-e', '--end [INTEGER]', 'number of chars to strip at end of line, default = 0') do |string|
    				self[:end] = string.to_i || 2
    				self[:end] = 0 if self[:end] < 0
    			end
     
    			opts.on('-r', '--reverse', 'strip chars between begin to end') do |string|
    				self[:reverse] = true
    			end
     
    			opts.on_tail('-h', '--help', 'Show help and quits') do
    				puts opts
    				exit 0
    			end
     
    		end
    		opts.parse!(args)
    		self[:begin], self[:end] = self[:end], self[:begin]			if self[:begin] > self[:end]
    	end
    end
     
    arguments = CatArguments.new(ARGV)
     
    begin
    	file = File.new( ARGV[0], "r" )
    rescue
    	file = STDIN
    end
     
    b = arguments[:begin]
    e = arguments[:end] + 1
    if arguments[:reverse]
    	while line = file.gets
    		puts line[0..b] + line[line.length-e,e]
    	end
    else
    	while line = file.gets
    		puts line[b..line.length-e]
    	end
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    time find . -name "*.php" -exec cutlines.sh {} \; > /dev/null
     
    euh après plus de 5 min d'attente : CTRL-C !
     
    ^C
     
    real    5m44.415s
    user    0m56.319s
    sys     4m34.899s
    en sed seul

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    time find . -name "*.php" -exec sed 's/\(.*\)..$/\1/' {} \; > /dev/null
     
    real    0m7.126s
    user    0m5.332s
    sys     0m1.379s
    test sur un seul fichier :
    Ruby
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    time cutlines.rb -e 2 myprofile.php > /dev/null
     
    real    0m0.043s
    user    0m0.021s
    sys     0m0.012s
    en shell

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    time cutlines.sh myprofile.php > /dev/null
     
    real    0m13.090s
    user    0m1.721s
    sys     0m8.346s

    no comment sur l'efficacité de lancer des process sur chaque ligne…

    entre sed et Ruby :
    le coût du lancement de l'interpréteur Ruby est évidemment visible…
    mais on le gardera à portée de main car le script est d'usage plus général…

    à noter quand même la particularité des 2 :
    si une ligne fait moins de 2 caractères, elle sera recopiée inchangée…
    (donc voir si c'est bien cela qui est désiré…)

  11. #11
    Membre confirmé Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Points : 509
    Points
    509
    Par défaut
    Citation Envoyé par _Mac_
    Allez, sed est mon ami :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\(.*\)..$/\1/' fichier
    En plus, c'est court

    Jolie. Y a pas à dire il y en as qui ont la classe.

  12. #12
    Membre confirmé Avatar de herzleid
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 393
    Points : 509
    Points
    509
    Par défaut
    Citation Envoyé par JeitEmgie
    encore faudrait-il que l'exemple avec echo et cut fonctionne…
    ce qui n'est pas le cas …
    car lorsqu'on traite des fichiers quelconques on peut avoir des lignes dont la longueur est 2 et $num est alors négatif, résultat :
    [code]
    J'avoue que lorsque je faits un script à l'arraché comme ça je vérifie pas si mes fichiers sont non vide, que la ligne contient bien le nb de caractères souhaités etc.. En plus c'etaitjuste pour le jeu. Enfin le fun.

    Enfin c'est bien d'avoir fournis les résultats du concours. Je crois que notre amis DragVinny va pouvoir choisir une solution en toute connaissance de cause, sauf si qq1 veux nous proposer une solution à base de java, python ou autre ^^

    Bon ok j'arrete le flood. En tout cas je trouve la solution en sed super courte et facile à retenir.

  13. #13
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par herzleid
    En tout cas je trouve la solution en sed super courte et facile à retenir.
    Comme je dis souvent : sed, c'est bien



    Fallait la faire, désolé

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  14. #14
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci à tous pour vos renseignement
    et une épine dans le pied en moins
    j'avais utilisé sed mais j'ma planté dans la cde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\(.*\)[][]$/\1/' fichier
    merci à tous
    et comme dirait _Mac_
    "Sed ,c'est bien"


  15. #15
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Votre expression sed est compliquée pour rien.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  16. #16
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Oui, effectivement, y avait encore plus simple

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/09/2011, 06h49
  2. Récupérer les derniers caractères d'une ligne d'un fichier texte
    Par Laaris dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/01/2009, 16h06
  3. Supprimer les 4 derniers caractères d'une chaine
    Par orditosh dans le forum WinDev
    Réponses: 4
    Dernier message: 28/06/2008, 12h40
  4. choper les deux derniers caractères d'une variable
    Par Mangacker dans le forum C++Builder
    Réponses: 12
    Dernier message: 14/11/2007, 19h08
  5. supprimer les 10 premiers caractères de chaques lignes
    Par herzleid dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 06/02/2007, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo