2012-06-06 13 views
16

Hier ist ein awk-Skript, das Differenz von zwei Dateien basierend auf ihrer ersten Spalte zu setzen versucht:Warum funktioniert awk "nicht in" Array genau wie awk "in" Array?

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

Hier ist TestFileA:

cat 
dog 
frog 

Hier ist TestFileB:

ee 
cat 
dog 
frog 

jedoch , wenn ich den folgenden Befehl ausführe:

gawk -f Diff.awk TestFileA TestFileB 

ich die Ausgabe so, als ob das Skript „in“ enthalten hatte:

cat 
dog 
frog 

Während ich unsicher bin, ob „nicht in“ richtige Syntax für meine Absicht ist, bin ich sehr neugierig, warum es verhält sich genauso, wie wenn ich "in" geschrieben habe.

+0

ich auch keine doc über „nicht in“ finden konnte, so dass ich damit einverstanden, dass es nicht die korrekte Syntax für meine ursprüngliche Absicht ist, aber das ist nicht die eigentliche Frage war, . – merlin2011

Antwort

19

Ich kann keine doc über element not in array finden.

Versuchen Sie !(element in array).


Ich denke: awk sieht not als nicht initialisierten Variablen, so not als leere Zeichenfolge ausgewertet wird.

+0

Ich kann nicht aus deinem Code ersehen, was du zu tun versuchst und selbst wenn ich das eigensinnige "nicht" Barwort herausnehme, bekomme ich immer noch Syntaxfehler. Versuchen Sie 'awk --lint -f yourfile.awk yourdatafile – starbolin

+1

@starbolin: Ich denke, du meintest für Sie Kommentar an die Frage angehängt werden, da es hier keinen Sinn macht. Sie sollten keine Syntaxfehler bekommen, da nichts (anderes) mit dem Skript falsch ist. –

+0

if (! (I in Array)) .... – mug896

1

Nicht sicher, ob dies etwas ist, was Sie versuchten zu tun.

#! /bin/awk 
# will read in the second arg file and make a hash of the token 
# found in column one. Then it will read the first arg file and print any 
# lines with a token in column one not matching the tokens already defined 
BEGIN{ 
    OFS=FS="\t" 
    file = ARGV[1] 
    while (getline < file) 
     Contained[$1] = $1 
# delete ARGV[1] # I don't know what you were thinking here 
# for(i in Contained) {print Contained[i]} # debuging, not just for sadists 
    close (ARGV[1]) 
} 
{ 
    if ($1 in Contained){} else { print $1 } 
} 

14

Ich dachte mir das aus. Die (x in Array) einen Wert, so "in Array nicht" zu tun, können Sie dies tun:

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

oder in Ihrem Beispiel:

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

In meiner Lösung für dieses Problem ich verwende die folgende if-else Aussage:

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