J'apprends awk du 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 (par exemple 1
), j'utilisais cette commande qui fonctionne bien:
awk '$2==1 {print $3}' <infile> | more
Mais lorsque 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 aucune sortie et je suis sûr que «findtext» existe sur le fichier d'entrée.
J'ai aussi essayé ceci, mais cela ne fonctionne pas:
awk '$1== "findtext" {print $3}' <infile> | more
Voici mon fichier de test nommé `` test '' et il comporte 9 lignes et 8 champs, séparés par un espace:
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 ce 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 renvoyé. Des pensées?
Réponses:
Si vous recherchez une chaîne en particulier, mettez des guillemets autour d'elle:
Sinon, awk supposera que c'est un nom de variable.
la source
awk '{ print $8 }'
vous donner ce que vous attendez?AWK
mise en œuvre (vérifiez-le avecawk --version
), jetez un œil à ma réponse, cela fonctionneGAWK
etMAWK
aussi.awk "$1 == \"findtext\" {print $3}"
Cette méthode utilise regexp, cela devrait fonctionner:
la source
Selon l'
AWK
implémentation que vous utilisez,==
c'est correct ou non.Avez-vous essayé
~
?. Par exemple, si vous voulez que $ 1 soit "bonjour":^
signifie 1 $ de début et$
1 $ de fin.la source
awk
n'a pas réussi à correspondre avec==
, mais a réussi avec~
.$1 == "hello"
et$1 ~ /^hello$/
. Vous ne devriez jamais faire$1 ~ "^hello$"
comme indiqué dans cette réponse car il utilise une chaîne dans un contexte de regexp et donc awk doit convertir la chaîne en une expression régulière avant de l'utiliser et cela a des effets secondaires (man awk).C'est plus lisible pour moi
la source
Ma version awk est 3.1.5.
Oui, le fichier d'entrée est séparé par des espaces, pas de tabulations.
Selon la réponse d'arutaku, voici ce que j'ai essayé qui a fonctionné:
Ce qui n'a pas fonctionné (je ne sais pas pourquoi et peut-être à cause de ma version awk :),
Merci à tous pour vos réponses, commentaires et aide!
la source
ClNonZ<control-M>
,ClNonZ
ce n'est pas pourquoi une comparaison de correspondance partielle RE comme effectuée avec grep ou "~ "dans awk le trouve mais pas une comparaison d'égalité.essayez ceci
ou
la source