web-dev-qa-db-fra.com

awk partiellement correspondance de chaîne (si colonne / mot correspond partiellement)

Mon fichier factice ressemble à ceci:

C1    C2    C3    
1     a     snow   
2     b     snowman 
snow     c     sowman

Je veux obtenir une ligne s'il y a une chaîne snow dans $ 3. Je peux faire ça comme ça:

awk '($3=="snow" || $3=="snowman") {print}' dummy_file

Mais il devrait y avoir un moyen plus simple.

67
PoGibas
awk '$3 ~ /snow/ { print }' dummy_file 
123
Ahmed Masud

Également possible en recherchant une chaîne avec la fonction index ():

awk '(index($3, "snow") != 0) {print}' dummy_file

Version plus courte:

awk 'index($3, "snow")' dummy_file
32
Thunderbeef

Peut-être que cela aidera

http://www.math.utah.edu/docs/info/gawk_5.html

awk '$3 ~ /snow|snowman/' dummy_file
7
Ahmed Al Hafoudh

Imprimer les lignes dont le troisième champ est soit snow, soit snowman uniquement:

awk '$3~/^snow(man)?$/' file
5
Chris Seymour

GNU sed

sed '/\s*\(\S\+\s\+\)\{2\}\bsnow\(man\)\?\b/!d' file

Contribution:

 C1 C2 C3 
 1 a neige 
 2 b bonhomme de neige 
 Neige c sowman 
 Neige neige bonhomme de neige 

..sortie:

 1 a neige 
 2 b bonhomme de neige 
3
Endoro