Awk - 2つのファイルの数を比較し、新しいファイルに違いを書き込みます。

Awk - 2つのファイルの数を比較し、新しいファイルに違いを書き込みます。

アイテム番号を含む2つのリストがありますが、両方のファイルに存在しない番号を新しいファイルに作成して、このリスト間の違いを表示したいと思います。

両方のファイルには、2列に項目番号があり、3列に部品IDがあります。まず、ファイル1のエントリ番号が存在することを確認したいと思います。存在する場合は部品IDを確認し、trueの場合は次の項目番号に移動する必要があります。それ以外の条件が満たされない場合は、新しく作成されたファイルに違いを記録する必要があります。エントリ番号が2つのファイルのうちの1つにのみ存在する場合、プログラムは「Artikel [x]が見つかりません」と書く必要があります。

はい

ファイル1

Artikel[ 456]= 1,2
Artikel[ 877]= 3
Artikel[ 278]= 4
Artikel[ 453]= 13

ファイル2

Artikel[ 456]= 2, 1 
Artikel[ 877]= 3, 5 
Artikel[ 387]= 4, 9, 4 
Artikel[ 947]= 10

出力

Artikel[ 877]= 3 != Artikel[ 877]= C3, C5
Artikel[ 278]= 4 != Artikel[ 278 ]= 4, 9, 4
Artikel[ 453]= 13 cannot be found in File 2!
Artikel[ 947]= 10 cannot be found in File 1!

私はファイル1のエントリ番号を配列に書き、ファイル2の各行を確認することでこれを行うことができると思いましたが、なぜか管理に問題があります。助けてくれてありがとう。

ありがとう

ベストアンサー1

POSIX awkを使用してください。

$ cat tst.awk
BEGIN {
    FS = "[]=[]+"
    f1 = ARGV[1]
    f2 = ARGV[2]
}
{
    gsub(/[[:space:]]+/,"")
    gsub(/,/,"& ")
    key = $1 "[ " $2 " ]="
    keys[key]
    vals = substr($0,index($0,"=")+1)
}
FILENAME == f1 {
    f1KeyVals[key] = vals
}
FILENAME == f2 {
    f2KeyVals[key] = vals
}
END {
    for ( key in keys ) {
        if ( (key in f1KeyVals) && (key in f2KeyVals) ) {
            if ( f1KeyVals[key] != f2KeyVals[key] ) {
                areDifferent = 0

                delete f1vals
                split(f1KeyVals[key],tmp,/, */)
                for ( i in tmp ) { f1vals[tmp[i]] }

                delete f2vals
                split(f2KeyVals[key],tmp,/, */)
                for ( i in tmp ) { f2vals[tmp[i]] }

                for ( val in f1vals ) {
                    if ( val in f2vals ) {
                        delete f2vals[val]
                    }
                    else {
                        areDifferent = 1
                        break
                    }
                }

                for ( val in f2vals ) {
                    areDifferent = 1
                    break
                }

                if ( areDifferent ) {
                    printf "%s %s != %s %s\n", key, f1KeyVals[key], key, f2KeyVals[key]
                }
            }
        }
        else if ( key in f2KeyVals ) {
            printf "%s cannot be found in %s!\n", key, f1
        }
        else {
            printf "%s cannot be found in %s!\n", key, f2
        }
    }
}
$ awk -f tst.awk file1 file2
Artikel[ 5129720100 ]= cannot be found in file2!
Artikel[ 5089100000 ]= C3 != Artikel[ 5089100000 ]= C3, C5
Artikel[ 4005530901 ]= cannot be found in file1!
Artikel[ 5091270000 ]= C4 != Artikel[ 5091270000 ]= C4, C19, C34

上記は、たとえば、値が繰り返される場合はC1, C1, C2繰り返されないのと同じ方法で処理される必要があると仮定しますC1, C2

おすすめ記事