2016-07-07 5 views
0

私は二つのファイルAWK列が他の人が行っているときには全く印刷しませんか?

マイawkスクリプトで働いている非常に奇妙な問題を抱えている:

その行が等しい両方のファイルの両方の最初のフィールドに一致させるためのもの。次に、他のフィールドで他の条件を実行し、一致するかどうかを確認します。これは他のすべてのフィールドで正常に動作しているようですが、最初のファイルの2番目のフィールド$ 2には値が設定されません。

#!/bin/awk -f 
BEGIN { 
    FS=OFS="," 
    total = 0; 
} 

FNR==NR{ 
    reg[$1] = $1; 
    reg_s[$2] = $2; 
    account[$3] = $3; 
    site_name[$4] = $4; 
    next; 
} 
{ 
    if ($1 in reg) 
     if ((($2 != "Yes") && (reg_s[$2] == "3")) || (($2 == "Yes") && (reg_s[$2] != "3"))) { 
      print "Status Error"; 
      total++; 
     }   
} 
END { 
    print " - DONE - " total" Errors" 
} 

どこが間違っていますか?

FILE1:

abcd,3,Paper,go 
abcde,3,stapler,staples 
abb,0,pencil,sharpener 

FILE2:

abcd,Yes,Paper,go 
abcde,Yes,stapler,staples 
abb,No,pencil,sharpener 

それを実行するには:

awk -f myscript.awk file1 file2 
+0

あなたは 'reg_s [$ 2] ==" 3 "'をチェックしていますが、 'reg_s [$ 2] = $ 2'配列インデックスとフィールド値の内容は、最初のファイルで設定されたものと同じです。 'reg_s [" Yes "]'はありません。もしあなたが何をしたいのかを説明すれば、おそらく助けになるでしょう。 – karakfa

+0

混乱して申し訳ありません。基本的に、2番目のファイルの$ 2が「はい」で、最初のファイルの$ 2が「3」でない場合は、アクションを実行します。 – yaman

+0

FNR == NRの外にreg_sが存在する必要がありますか? 2番目のフィールドは最初のファイルでは3で、他のフィールドでは3であるためです。 – yaman

答えて

1

は(最初にソートする必要がある)キーでファイルを結合に使用できる何か...

$ join -t, <(sort file1) <(sort file2) | 
    awk -F, '($2==3) != ($5=="Yes"){count++} END{print count+0}' 

で、一致するレコードをカウントします。 !a && b || a && !bはxorの定義であり、上記のように単にa!=bと書くことができます。

これはゼロを出力します。 (count+0は、条件を満たしていない場合に値を数値として初期化することです)

+0

非常に役に立ちました、ありがとう – yaman

0

は、次のデバッグ変更でスクリプトを実行します。

#!/bin/awk -f 
BEGIN { 
    FS=OFS="," 
    total = 0; 
} 

FNR==NR{ 
    reg[$1] = $1; 
    reg_s[$2] = $2; 
    account[$3] = $3; 
    site_name[$4] = $4; 
    next; 
} 
{ 
    print "----------reg----------------" 
    for (key in reg) { print key " : " reg[key] } 
    print "----------reg_s--------------" 
    for (key in reg_s) { print key " : " reg_s[key] } 
    print "----------account------------" 
    for (key in account) { print key " : " account[key] } 
    print "-----------site_name---------" 
    for (key in site_name) { print key " : " site_name[key] } 
    print "============================" 
} 

出力は次のとおりです:それはあなたが配列を移入する場合、最初の部分をデバッグ

----------reg---------------- 
abcd : abcd 
abb : abb 
abcde : abcde 
----------reg_s-------------- 
0 : 0 
3 : 3 
----------account------------ 
stapler : stapler 
Paper : Paper 
pencil : pencil 
-----------site_name--------- 
staples : staples 
go : go 
sharpener : sharpener 
============================ 

あなたが見ることができるように、すべての配列がreg_s除く3つの項目を持っている、とreg_sが割り当てられますので、それはあります同じキー "3"で2回、配列項目に既存のキーが割り当てられているときは、新しい配列項目を作成せず、代わりにprevoius値を置き換えます。

これは、2つの異なるキー「3」と「0」だけを使用して作成されたreg_sを除き、すべての異なるキーを持つため、3つの要素を持つすべての配列を持つ理由です。

このヘルプが必要な場合は、必要に応じて編集してさらに詳しいことができます。ここで

+0

スクリプトを簡単にするために編集しました。ありがとうございました – yaman

+0

データで達成しようとしているものの論理に依存するため、実際のソリューションを提供することはできませんが、私の答えでは、 – Ramiro

関連する問題