Con Perl se puede comprobar si un conjunto contiene un valor

$ perl -e '@foo=(444,555,666); print 555 ~~ @foo ? "T" : "F"'
T

Sin embargo con awk, este comando similar es el control de la matriz de índices en lugar de
los valores

$ awk 'BEGIN {split("444 555 666", foo); print 555 in foo ? "T" : "F"}'
F

¿Cómo puedo comprobar si un conjunto contiene un valor particular con awk?

Creo que la única opción es el bucle.
Como Etan dice, usted necesita un para-loop. Usted puede conseguir un poco flexible resultado mediante la creación de una nueva matriz (hash) con los valores de las claves, por ejemplo: awk 'BEGIN { split("444 555 666", foo); for(i=1; i<=length(foo); i++) bar[foo[i]]; print 555 in bar ? "T" : "F" }'
No puedes simplemente usar for( i in foo ) bar[foo[i]] lugar?
Tienes razón, más cortas y limpias, por lo que se convierte en: awk 'BEGIN { split("444 555 666", foo); for(i in foo) bar[foo[i]]; print 555 in bar ? "T" : "F" }'.

OriginalEl autor Steven Penny | 2014-11-04

2 Comentarios

  1. 8

    Awk noob aquí. He digerido Steven respuesta y terminó con este espero que sea más fácil de entender siguiente fragmento. Hay 2 problemas más sutiles:

    • Un Awk matriz es en realidad un diccionario. No ["value1", "value2"], es más como {0: "value1", 1: "value2"}.
    • in cheques para las llaves, y no hay manera integrada de comprobación de valores.

    Así que usted tiene que convertir su matriz (que es en realidad un diccionario) a un diccionario con los valores de las claves.

    BEGIN {
    
        split("value1 value2", valuesAsValues)
        # valuesAsValues = {0: "value1", 1: "value2"}
    
        for (i in valuesAsValues) valuesAsKeys[valuesAsValues[i]] = ""
        # valuesAsKeys = {"value1": "", "value2": ""}
    }
    
    # Now you can use `in`
    ($1 in valuesAsKeys) {print}

    Para uno-trazadores de líneas:

    echo "A:B:C:D:E:F" | tr ':' '\n' | \
    awk 'BEGIN{ split("A D F", parts); for (i in parts) dict[parts[i]]=""}  $1 in dict'

    OriginalEl autor phunehehe

  2. 6

    Basado en Thor comentario, esta función hace el truco para mí:

    function smartmatch(diamond, rough,   x, y) {
      for (x in rough) y[rough[x]]
      return diamond in y
    }
    BEGIN {
      split("444 555 666", z)
      print smartmatch(555, z) ? "T" : "F"
    }

    OriginalEl autor Steven Penny

Dejar respuesta

Please enter your comment!
Please enter your name here