Awk : garder les colonnes contenant regex

Résolu
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. Contributeur
    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
    1. 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
      1. Contributeur
        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. Contributeur
          && n'est pas une regex. pour chercher x et y :
          awk -v r="x.*y|y.*x" ...
          0
      2. 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
        1. Contributeur
          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