awk - 2つのファイル処理

awk - 2つのファイル処理

特定のフィールドで比較する必要がある2つのファイルがあります。

リファレンスドキュメント:

42:B:0
43:A:1
44:A:1
45:A:1

ターゲットファイル:

42:!:1
43:B:0
44:A:1
45:B:2

私が必要とするのは、「while」ループ+ awkを組み合わせることですでに達成できます。

$ cat reference|while IFS=: read a b c;do awk -F: -va=$a -vb=$b -vc=$c '$1==a{if($2!=b){if($3>c)if($2!="!"){ print a":target has bigger $3("$3">"c") and $2 different ("$2")" } else { print a":target has bigger $3("$3">"c") but $2 disabled ("$2")" }}}' target;done
42:target has bigger $3(1>0) but $2 disabled (!)
45:target has bigger $3(2>1) and $2 different (B)

「while」ループからどうやってこれらの2つのファイルをawkで直接処理できますか?

ベストアンサー1

awk -F: '
    FNR == NR { c2[$1] = $2; c3[$1] = $3; next }
    !($1 in c2) {
        printf("%d: $1 not found in reference\n", $1)
        next
    }
    $3 > c3[$1] && $2 == "!"    {
        printf("%d: target has bigger $3 (%d>%d) but disabled $2 (%s)\n", $1,$3,c3[$1],$2)
        next
    }
    $3 > c3[$1] && $2 != c2[$1] {
        printf("%d: target has bigger $3 (%d>%d) but different $2 (%s)\n", $1,$3,c3[$1],$2)
    }' reference target

その後、参照ファイルを読み込み、ターゲットファイルを読み込みます。

参照ファイルを読むと( )FNR == NR配列と 。使用されるインデックスは最初の列の値です。c2c3

ターゲットファイル(FNR != NR)を読み取ると、3番目の列の値を配列内の値と比較しますc3。次に、!2番目の列をの参照ファイルに格納されている2番目の列と比較しますc2

また、コードは、ターゲットファイルの最初の列が参照ファイルに見つからない場合は、追加のメッセージをエクスポートします。

質問のデータが与えられ、56:C:9ターゲット行の出力()を追加すると、次のようになります。

42: target has bigger $3 (1>0) but disabled $2 (!)
45: target has bigger $3 (2>1) but different $2 (B)
56: $1 not found in reference

おすすめ記事