Estoy aprendiendo awk desde El lenguaje de programación awk y de ser molestado por este ejemplo.

Si quiero imprimir $3 si $2 es igual a un valor(por ejemplo,’1′), y yo estaba usando este comando que funciona bien:

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

Pero cuando me sustituir 1 por otro la búsqueda de criterios, por ejemplo, ‘findtext’ y este comando no funciona.

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

Este no devuelve nada de salida y estoy seguro de que lo he puesto en ‘findtext’ estaba existen en ese lugar.
¿Hay algo malo con mi sintaxis?

He intentado esto pero no funciona:

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

Pero cuando hago

grep findtext <infile>  ## This does give me output

La findtext es existir en el $1 como ya he registrado el doble.

Este es mi archivo de prueba denominado ‘test’, por ejemplo, cuenta con 9 líneas y 8 campos y separados por espacios:

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

Esto es lo que hice y el resultado:

$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

Puedo esperar a ver este que es el de $3 que tiene «ClNonZ» en su $8.

0.180467091 
0.010615711 
0.492569002

No sé por qué la awk comando no devuelve nada. los pensamientos?

  • Usted necesidad de citar la cadena de valor «findtext», de lo contrario es un nombre de variable
  • Traté de comillas dobles con «findtext», pero no funciona.. por eso es que me molesta
  • «No funciona» no nos dice nada. Nos muestran exacto de los insumos, el código exacto, se espera la salida, y la salida real.
InformationsquelleAutor user1687130 | 2013-02-06

6 Comentarios

  1. 112

    Si usted está buscando una cadena en particular, poner comillas alrededor de él:

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

    De lo contrario, awk se asuma que se trata de un nombre de variable.

    • He intentado esto pero no funciona no sé por qué. Me comprueban con grep y el texto era de allí. 🙁
    • Creo que vas a necesitar para mostrarnos un ejemplo de la entrada y la salida esperada.
    • Está usted seguro de que sus datos están separados por espacios. Podrían algunos de los espacios pestañas? Trate de usar awk eco de un solo campo. ¿awk '{ print $8 }' Darte lo que esperas?
    • Podría ser debido a AWK de ejecución (marque con awk --version), echar un vistazo a mi respuesta, funciona en GAWK y MAWK demasiado.
    • Esto no funciona cuando hacemos uso de las comillas dobles en el script awk. Como awk "$1 == \"findtext\" {print $3}"
    • Bueno, sí que tiene sentido, dado que es probable que ejecutar ese comando desde una consola, y mediante el uso de comillas dobles estás diciendo la shell de no pasar la cadena directamente a awk pero para reemplazar a $1 y $3 con los valores de la primera.
    • ¿Y si queremos compararlo con cualquier variable ?

  2. 28

    Este método utiliza la expresión regular, se debe trabajar:

    awk '$2 ~ /findtext/{print $3}' <infile>
    • Gracias estaba buscando una manera de utilizar awk para encontrar regex en $NF sin usar diabólica métodos y grep ^^
  3. 17

    Dependiendo de la AWK aplicación está utilizando == está bien o no.

    ¿Has probado ~?. Por ejemplo, si desea $1 para ser «hola»:

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

    ^ significa $1 start, y $ es de $1 final.

    • Muy buena sugerencia! Gracias!
    • Todos awk implementaciones de apoyo tanto «==» y «~».
    • OS X awk no se corresponden con ==, pero logró con ~.
    • No se corresponden con lo que ¿con qué? Estos son equivalentes: $1 == "hello" y $1 ~ /^hello$/. Usted nunca debe hacer $1 ~ "^hello$" como se muestra en esta respuesta como es el uso de una cadena en un regexp contexto y así awk tiene para convertir la cadena en un regexp antes de usarlo y que tiene efectos secundarios (hombre awk).
  4. 2

    Mi awk es la versión 3.1.5.

    Sí, el archivo de entrada está separada por espacios, sin fichas.

    Según arutaku la respuesta, aquí está lo que he intentado que trabajó:

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

    Lo que no funcionó(no sé por qué, y tal vez debido a mi awk versión:),

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

    Gracias a todos por sus respuestas, comentarios y ayuda!

    • Esto no tiene nada que ver con su awk versión. Has creado el archivo de prueba en Windows, por lo iwhatever herramienta que se usa para hacer que anexa de control-Ms para el final de cada línea, de modo que el último campo de cada línea es ClNonZ<control-M>, no ClNonZ es por eso que un RE coincidencia parcial comparación a como se realiza con grep o «~» en awk la encuentra, pero una comparación de igualdad no.
    • Sí, tiene sentido. Traté de $dos2unix de prueba y, a continuación, utilizar «==» para sustituir a «~» y funciona. Gracias por la explicación!
  5. -3

    por favor trate de esta

    echo $VAR | grep ClNonZ | awk '{print $3}';

    o

    echo cat filename | grep ClNonZ | awk '{print $3}';
    • Lamentablemente esta respuesta, en realidad, no usar Awk sintaxis de que el usuario haya pedido!

Dejar respuesta

Please enter your comment!
Please enter your name here