125 votes

utilisation de l'awk avec des conditions de valeur de colonne

J'apprends l'awk à partir de Le langage de programmation AWK et j'ai un problème avec l'un des exemples.

Si je voulais imprimer $3 si $2 est égal à une valeur (ex. 1 ), j'utilisais cette commande qui fonctionne bien :

awk '$2==1 {print $3}' <infile> | more

Mais quand je remplace 1 par un autre critère de recherche, (par exemple findtext ), la commande ne fonctionne pas :

awk '$1== findtext {print $3}' <infile> | more

Il ne renvoie aucun résultat et je suis sûr que 'findtext' existe dans le fichier d'entrée.

J'ai également essayé ceci, mais cela ne fonctionne pas :

awk '$1== "findtext" {print $3}' <infile> | more

Voici mon fichier de test, nommé 'test', qui comporte 9 lignes et 8 champs, séparés par des espaces :

1 11 0.959660297 0 0.021231423 -0.0073 -0.0031 MhZisp
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
3 19 0.98089172 0 0 -0.0158 0.0124 MhNonZ
4 15 0.704883227 0.265392781 0.010615711 -0.0087 -0.0092 MhZisp
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
6 23 0.715498938 0 0.265392781 -0.0013 -0.0309 Unkn
7 26 0.927813163 0 0.053078556 -0.0051 -0.0636 MhZisp
8 44 0.55626327 0.222929936 0.201698514 0.0053 -0.0438 MhZisp
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

Voici ce que j'ai fait et le résultat :

$awk '$8 == "ClNonZ" {print $3}' test 

$ grep ClNonZ test 
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

Je m'attends à voir ceci qui est le 3 qui a "ClNonZ" dans leur 8 $.

0.180467091 
0.010615711 
0.492569002

Je ne sais pas pourquoi la commande awk n'a rien donné. Une idée ?

155voto

Rob Davis Points 7639

Si vous recherchez une chaîne de caractères particulière, mettez-la entre guillemets :

awk '$1 == "findtext" {print $3}'

Sinon, awk supposera qu'il s'agit d'un nom de variable.

37voto

Ell Points 678

Cette méthode utilise le regexp, cela devrait fonctionner :

awk '$2 ~ /findtext/ {print $3}' <infile>

21voto

arutaku Points 2287

En fonction de la AWK implémentation que vous utilisez == est ok ou pas.

Avez-vous essayé ~ ?. Par exemple, si vous voulez que $1 soit "hello" :

awk '$1 ~ /^hello$/{ print $3; }' <infile>

^ signifie 1 dollar de départ, et $ est la fin de $1.

5voto

user2773013 Points 2470

C'est plus lisible pour moi

awk '{if ($2 ~ /findtext/) print $3}' <infile>

2voto

user1687130 Points 788

Ma version d'awk est 3.1.5.

Oui, le fichier d'entrée est séparé par des espaces, sans tabulation.

Selon la réponse d'arutaku, voici ce que j'ai essayé et qui a fonctionné :

awk '$8 ~ "ClNonZ"{ print $3; }' test  
0.180467091
0.010615711
0.492569002

$ awk '$8 ~ "ClNonZ" { print $3}' test  
0.180467091
0.010615711
0.492569002

Ce qui n'a pas fonctionné (je ne sais pas pourquoi et peut-être à cause de ma version d'awk :),

$awk '$8 ~ "^ClNonZ$"{ print $3; }' test
$awk '$8 == "ClNonZ" { print $3 }' test

Merci à tous pour vos réponses, vos commentaires et votre aide !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X