2012-06-06 10 views
16

は、彼らの最初の列に基づいて、2つのファイルの違いを設定しようとawkスクリプトです:ここでawkが "not in"配列で動作するのはなぜawk "in"配列と同様ですか?ここ

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

はTestFileAです:しかし

ee 
cat 
dog 
frog 

:ここ

cat 
dog 
frog 

はTestFileBです、私は次のコマンドを実行するとき:

gawk -f Diff.awk TestFileA TestFileB 

私は、スクリプトが「中」に含まれていたかのように出力を得る:

cat 
dog 
frog 

私は私の意図の正しい構文である「ないで」かどうかについての不確実だが、私はなぜそれについて非常に好奇心が強いです私が "in"と書いたときとまったく同じように動作します。

+0

:私は、次のif-elseステートメントを使用します。 – merlin2011

答えて

19

約約element not in arrayが見つかりません。

try !(element in array)


私は推測する:awkは初期化されていない変数としてnotを見て、そうnotは、空の文字列として評価されます。

$1 not == $1 "" == $1 
+0

私はあなたのコードからあなたがやろうとしていることを知ることができません。そして、たとえ私がまだ「bareword」ではないとしても、私はまだ構文エラーを受けます。 'awk --lint -f yourfile.awk yourdatafileを試してみてください。 – starbolin

+1

@starbolin:ここには何の意味も付けられていないので、あなたはあなたがその質問に付け加えるコメントを意味すると思います。スクリプトに何も(他の)間違いがないので、構文エラーを受け取るべきではありません。 –

+0

if(!(i in array)).... – mug896

1

これが何かしようとしていたかどうかはわかりません。

#! /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

私はこれを考え出しました。 (配列中のx)は、あなたがこれをしなければならないので、「ない配列に」行うには、値を返します。この問題のために私の解決策で

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

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

またはあなたの例では

それは実際の問題ではありませんでしたが、私も「ないで」についてのドキュメントを見つけることができなかったので、私はそれが私の本来の意図の正しい構文ではないことに同意し

if($1 in contained);else{print "Here goes your code for \"not in\""} 
関連する問題