awk coincide parcialmente con la cadena (si la columna / palabra coincide parcialmente)

83

Mi archivo ficticio se ve así:

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

Quiero obtener una línea si hay una cadena snowen $ 3. Puedo hacer esto así:

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

Pero debería haber una forma más sencilla.

PoGibas
fuente

Respuestas:

157
awk '$3 ~ /snow/ { print }' dummy_file 
Ahmed Masud
fuente
27
estrictamente hablando, la impresión no es necesaria: '$3~/snow/'suficiente
SheetJS
2
Lamentablemente, ese enlace ya está muerto: aquí está el enlace actual shop.oreilly.com/product/9781565924277.do
Stedy
Tu patrón es "nieve", mientras que si hay un símbolo especial, como [\ "en mi caso, el índice () es una mejor solución.
Qiu Yangfan
¿Hay alguna forma de anular el cheque? Sé que podemos usar 'siguiente' en lugar de 'imprimir' e imprimir todo lo demás, pero solo verificando algo con menos instrucciones
Sahas
5
utilizar ! por ejemplo, awk '$ 3! ~ / foo /'
Ahmed Masud
41

También es posible buscando una subcadena con la función index ():

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

Versión más corta:

awk 'index($3, "snow")' dummy_file
Thunderbeef
fuente
7
Esto es mejor que la respuesta de Ahmed Masud, porque procesa "nieve" como una cadena literal, no como una expresión regular.
jarno
6
Podría escribirlo aún más simple:awk 'index($3, "snow")' dummy_file
jarno
2
Estoy de acuerdo en que esto es mejor que mi respuesta.
Ahmed Masud
8

Imprima líneas donde el tercer campo sea snowo snowmansolo:

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

GNU sed

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

Entrada:

C1 C2 C3    
1 una nieve   
2 b muñeco de nieve 
nieve c sowman
      nieve nieve muñeco de nieve

..salida:

1 una nieve
2 b muñeco de nieve
Endoro
fuente
9
Esta no podría ser una respuesta más complicada a una pregunta bastante sencilla.
Sam
1
Además, es MUY arriesgado usarlo sedpara palabras completas. Aunque técnicamente posible, para que eso funcione de manera confiable, tuve que usar mirar atrás, mirar hacia adelante y !?construcciones cuando se trataba de palabras que no deberían seguir. Esto no es nada para los débiles de corazón, eso es seguro. (Y propenso a errores que pueden consumir mucho tiempo para encontrarlos y corregirlos).
syntaxerror