25

これは、最初の列に基づいて2つのファイルの差を設定しようとするawkスクリプトです。

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

TestFileAは次のとおりです。

cat
dog
frog

TestFileBは次のとおりです。

ee
cat
dog
frog

ただし、次のコマンドを実行すると、次のようになります。

gawk -f Diff.awk TestFileA TestFileB

スクリプトに「in」が含まれているかのように出力を取得します。

cat
dog
frog

「notin」が私の意図に対して正しい構文であるかどうかはわかりませんが、「in」と書いたときとまったく同じように動作する理由については非常に興味があります。

4

5 に答える 5

34

に関するドキュメントが見つかりませんelement not in array

試してみてください!(element in array)


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

$1 not == $1 "" == $1
于 2012-06-06T23:45:48.020 に答える
22

私はこれを理解しました。(x in array)は値を返すため、「not in array」を実行するには、次のようにする必要があります。

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

またはあなたの例では:

($1 in Contained == 0){
   print $0
}
于 2012-10-09T22:22:23.263 に答える
2

この問題の解決策では、次のif-elseステートメントを使用します。

if($1 in contained);else{print "Here goes your code for \"not in\""}
于 2017-06-27T15:04:26.760 に答える
1

これがあなたがやろうとしていたようなものかどうかはわかりません。

#!/ bin / awk
#2番目のargファイルを読み込み、トークンのハッシュを作成します
#1列目にあります。次に、最初のargファイルを読み取り、任意のファイルを出力します。
#列1にトークンがあり、すでに定義されているトークンと一致しない行
始める{
    OFS = FS = "\ t"
    ファイル=ARGV[1]
    while(getline <file)
        含まれる[$1]= $ 1
#ARGV [1]を削除#ここで何を考えていたのかわかりません
#for(i in Contained){print Contained [i]}#サディストだけでなくデバッグ
    閉じる(ARGV [1])
}
{{
   if($ 1 in Contained){} else {print $ 1}
}

于 2012-06-07T02:00:30.920 に答える
0

awkコマンドラインで私は使用します:

 ! ($1 in a)
$1 pattern
a array

例:

awk 'NR==FNR{a[$1];next}! ($1 in a) {print $1}' file1 file2
于 2020-02-05T12:23:34.250 に答える