Supprimer des champs par lignes d'un fichier

fptv7514 -  
 fptv7514 -
Bonjour,
Script bash
je dois formater un fichier pour chaque lignes soient identiques en nombre de champs !!
En gros mon fichier toto.txt comporte 100 lignes et sur chaque ligne il y a de 10 à 12 champs séparé par des espaces.

Ce que je veux en retour c'est le meme fichier toto.txt avec des lignes de 10 champs !!
donc par exemple pour une ligne avec 12champs je veux supprimer le champs 5 et 6
pour une ligne avec 11 champs je veux supprimer le champs 5
pour une ligne avec 10 champs rien faire

Ex : fichier de départ :
toto1 toto2 toto3 toto4 toto5 toto6 toto7 toto8 toto9 toto10 toto11 toto12
tata1 tata2 tata3 tata4 tata5 tata6 tata7 tata8 tata9 tata10 tata11
titi1 titi2 titi3 titi4 titi5 titi6 titi7 titi8 titi9 titi10

fichier résultats:
toto1 toto2 toto3 toto4 toto7 toto8 toto9 toto10 toto11 toto12
tata1 tata2 tata3 tata4 tata6 tata7 tata8 tata9 tata10 tata11
titi1 titi2 titi3 titi4 titi5 titi6 titi7 titi8 titi9 titi10

Comme cela j'ai un fichier avec des lignes de 10 champs maxi.
Cordialement
Configuration: Linux RHEL 5

10 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    correction
    awk 'NF == 12 {$6=$5=""} ; NF == 11 {$5=""} ; {print $0}' < fichier
    2
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Une idée avec sed...
    [tmpfs]$ cat fichier
    dans un fichier je doit supprimer des lignes entières
    supprimer les lignes commençant par Block
    supprimer les lignes commençant par Statistics
    
    supprimer les lignes commençant par Total
    supprimer les lignes commençant par Entries
    
    supprimer les lignes commençant par Used
    supprimer les lignes commençant par Data
    supprimer les lignes vides
    
    supprimer les lignes avec que des moins : - - - - - - - - - - - mais tous collés les uns aux autres
    ------------- - - - - - - - - - -
    ---------------------------------
    -------- ----- - - - - ----------------
    -
    Block blabla
    Statistics blabla
    Total blabla
    Entries blabla
    Used blabla
    Data blabla
    
    [tmpfs]$ sed '/^\(Block\|Statistics\|Total\|Entries\|Used\|Data\|-*$\)/d' fichier
    dans un fichier je doit supprimer des lignes entières
    supprimer les lignes commençant par Block
    supprimer les lignes commençant par Statistics
    supprimer les lignes commençant par Total
    supprimer les lignes commençant par Entries
    supprimer les lignes commençant par Used
    supprimer les lignes commençant par Data
    supprimer les lignes vides
    supprimer les lignes avec que des moins : - - - - - - - - - - - mais tous collés les uns aux autres
    ------------- - - - - - - - - - -
    -------- ----- - - - - ----------------
    [tmpfs]$
    ;-))
    2
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      Une question: je ne vois pas dans les expressions la suppression des lignes vides ^$ pourtant elles le sont ?
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Salut,

        En fait les lignes vident sont englobées dans "-*$" (le début "^" étant générique avec les parenthèses).

        Le "-*" matchant la présence d'un tiret ou pas et dans le cas où il n'y en a pas, c'est alors considéré comme une ligne vide.

        Je t'avoue que dans mon 1er jet de la syntaxe j'avais mis un "^$" suivi du "-*$"...

        ;-))
        0
      2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        effectivement - ou rien ...c'est beau les RE
        0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    awk 'NF == 12 {$6=$5=""} ; NF == 11 {$6=""} ; {print $0}' < fichier
    0
  4. fptv7514
     
    Merci beaucoup cela marche nickel, j'avais corriger la petite erreur mais rien de grave !!
    Par contre dans la meme idée :
    dans un fichier je doit supprimer des lignes entières
    supprimer les lignes commençant par Block
    supprimer les lignes commençant par Statistics
    supprimer les lignes commençant par Total
    supprimer les lignes commençant par Entries
    supprimer les lignes commençant par Used
    supprimer les lignes commençant par Data
    supprimer les lignes vides
    supprimer les lignes avec que des moins : - - - - - - - - - - - mais tous collés les uns aux autres

    Si possible tout en meme temps
    Moi j'ai trouvé ça , mais j'arrive pas à faire tout ensemble.
    awk ' $1!="Block" { print; } ' < fichier

    Cordialement
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. fptv7514
     
    Encore un grand merci !!!
    dernière demande enfin je pense !!

    Dans mon fichier j'ai des lignes commençant par *** blabla blabla blabla /blabla

    je veux supprimer le début de la ligne jusqu 'au symbole /

    Merci pour votre aide
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    j'ai des lignes commençant par *** blabla blabla blabla /blabla
    Peux-tu être plus précis s'il te plaît ?

    Elles commencent par "***" ?
    Il y-a-t'il qu'un seul slash dans la ligne ?
    Est-ce les seules lignes commençant par "***" ?

    Un exemple précis et concret serait le bienvenu ;-)
    0
  8. fptv7514
     
    Voici le type de ligne :

    *** Report for user quotas on device /dev/sde1
    *** Report for user quotas on device /dev/sdf1

    moi je veux juste :

    /dev/sde1
    /dev/sdf1

    Voila.
    Merci
    0
  9. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    une possibilite
    awk '/^\*\*\*/ {print $NF}' < fichier
    0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    sed '/^\*/{s/[^/]*//}' fichier
    0