He aquí un script awk que intenta establecer la diferencia de dos archivos basados en su primera columna:

BEGIN{
    OFS=FS="\t"
    file = ARGV[1]
    while (getline < file)
        Contained[$1] = $1
    delete ARGV[1]
    }
$1 not in Contained{
    print $0
}

Aquí es TestFileA:

cat
dog
frog

Aquí es TestFileB:

ee
cat
dog
frog

Sin embargo, cuando ejecuto el siguiente comando:

gawk -f Diff.awk TestFileA TestFileB

Puedo obtener la salida como si el guión hubiera contenido «en»:

cat
dog
frog

Mientras estoy seguro acerca de si «no» es la sintaxis correcta para que mi intención, estoy muy curioso acerca de por qué se comporta exactamente de la misma manera como cuando escribí «en».

  • Además, no podía encontrar ningún doc sobre el «no», así que estoy de acuerdo que no es la sintaxis correcta para que mi intención original, aunque esa no era la pregunta.
InformationsquelleAutor merlin2011 | 2012-06-06

4 Comentarios

  1. 27

    No puedo encontrar cualquier doc sobre element not in array.

    Intentar !(element in array).


    Supongo: awk ve not como una variable no inicializada, así not se evalúa como una cadena vacía.

    $1 not == $1 "" == $1
    • No le puedo decir a partir de su código lo que estamos tratando de hacer, e incluso si me saco el díscolo ‘no’ bareword todavía me dan errores de sintaxis. Tratar de ‘awk –pelusa -f yourfile.awk yourdatafile
    • Creo que significó para ti el comentario adjunto a la pregunta, ya que no tiene ningún sentido adjunto aquí. Usted no debería tener errores de sintaxis, ya no hay nada (más) mal con la secuencia de comandos.
    • si (!( yo en la serie )) ….
  2. 16

    Me imaginé esto. La ( x) en el array ) devuelve un valor, así que para no «en la serie», tienes que hacer esto:

    if ( x in array == 0 )
       print "x is not in the array"

    o en su ejemplo:

    ($1 in Contained == 0){
       print $0
    }
  3. 1

    No estoy seguro si esto es algo como que estaba tratando de hacer.

    #! /bin/awk 
    # se lee en el segundo arg archivo y hacer un hash de la muestra 
    # encontrado en la columna uno. A continuación, se va a leer el primer argumento de impresión y archivo de cualquier 
    # líneas con un símbolo en la columna uno que no coincidan con los tokens ya definido 
    BEGIN{ 
    OFS=FS="\t" 
    archivo = ARGV[1] 
    mientras (getline < archivo) 
    Contenido[$1] = $1 
    # eliminar ARGV[1] # no sé lo que estás pensando aquí 
    # for(i in Contenido) {print Contenido[i]} # depuración, no sólo para los sádicos 
    cierre (ARGV[1]) 
    } 
    { 
    si (1$Contenido){} else { print $1 } 
    } 
    
    
  4. 1

    En mi solución para este problema yo uso el siguiente if-else declaración:

    if($1 in contained);else{print "Here goes your code for \"not in\""}

Dejar respuesta

Please enter your comment!
Please enter your name here