Awk : garder les colonnes contenant regex

Résolu
Bulot56 Messages postés 10 Statut Membre -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

J'ai un fichier (monstrueux avec plein de colonnes!) dont je voudrai garder uniquement les colonnes dont la première ligne contient regex (en l'occurrence X, Y ou Z).

Par exemple :
tens1 x1 y1 z1 ea1 tens2 tens3 x3
4 6 3 7 9 10 36 3

devient :
x1 y1 z1 x3
6 3 7 3

J'imagine que awk est mon ami (mais je me trompe peut être ...).

Une bonne idée ?

5 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    $ awk -v regex="x|y|z" 'NR==1 {for(n=1; n<=NF; n++)if($n ~ regex)c[++col]=n} {for(n=1; n<=col;)printf $c[n++] OFS; print ""}' fichier
    x1 y1 z1 x3 
    6 3 7 3 
    $
    
    1
  2. Bulot56 Messages postés 10 Statut Membre
     
    Mieux qu'une bonne idée, une solution !
    C'est super efficace, merci beaucoup ...

    Bon, si je décortique un peu, "|" c'est OU
    Si je veux faire un ET ? J'ai pas beaucoup de succès avec '&' .
    0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    oui, | c'est ou.
    pour and, il faut un peu changer la regexp: par ex , contient x ou z ET y
    awk -v r="x|z && y" ...
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      && n'est pas une regex. pour chercher x et y :
      awk -v r="x.*y|y.*x" ...
      0
  4. Bulot56 Messages postés 10 Statut Membre
     
    Merci bcp ! Bon, je complique un tout petit peu la tache ... je cherche à garder les colonnes contenant ou $x ou $y ou $z. J'arrive pas à échapper le $ ! Est ce que tu as encore une solution ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    double \
    $ cat a0
    tens1 $x1 y1 $z1 ea1 tens2 tens3 x3
    4 6 3 7 9 10 36 3
    $ awk -v regex='\\$x|\\$y|\\$z' 'NR==1 {for(n=1; n<=NF; n++)if($n ~ regex)c[++col]=n} {for(n=1; n<=col;)printf $c[n++] OFS; print ""}' a0
    $x1 $z1 
    6 7 
    $ 
    
    0