Awk : garder les colonnes contenant regex

Résolu/Fermé
Bulot56 Messages postés 10 Date d'inscription mardi 24 janvier 2012 Statut Membre Dernière intervention 30 avril 2015 - 31 juil. 2013 à 09:44
dubcek Messages postés 18764 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 9 février 2025 - 6 août 2013 à 08:36
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

dubcek Messages postés 18764 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 9 février 2025 5 624
31 juil. 2013 à 10:53
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
Bulot56 Messages postés 10 Date d'inscription mardi 24 janvier 2012 Statut Membre Dernière intervention 30 avril 2015
31 juil. 2013 à 11:51
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
dubcek Messages postés 18764 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 9 février 2025 5 624
31 juil. 2013 à 12:49
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
dubcek Messages postés 18764 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 9 février 2025 5 624
2 août 2013 à 10:03
&& n'est pas une regex. pour chercher x et y :
awk -v r="x.*y|y.*x" ...
0
Bulot56 Messages postés 10 Date d'inscription mardi 24 janvier 2012 Statut Membre Dernière intervention 30 avril 2015
5 août 2013 à 17:13
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18764 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 9 février 2025 5 624
6 août 2013 à 08:36
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