Verwenden von awk/for/grep zum Vergleichen von zwei Dateien

Verwenden von awk/for/grep zum Vergleichen von zwei Dateien

Ich habe 2 CSV-Dateien, deren Inhalt ist-

expo1.csv:

102,GROSSARTIG,Adjektiv,ENG,p1_0,nein,p2_1,nein,p3,nein,4,ja,p5_2,nein,p6,ja...,su1,amb,su_09,nein

104,BHAAG,Verb,HIN,p1,ja,p2,nein,p3_7,amb,p4,nein,p5,nein,p6_9,ja...,sg4_3,ja,su119,amb

110,.......,su11_0,amb

Und impo1.csv:

104,p1,no
102,p2,yes
104,p10,no
110,su11,no

Im Grunde expo1.csvhandelt es sich um eine Datei auf dem Server, die impo1.csvich zum Aktualisieren erstellt habe expo1.csv. Ein Skript nimmt die Änderungen expo1.csvwie in angegeben vor, impo1.csvnachdem es eine leichte Verarbeitung der impo1-Daten durchgeführt hat (z. B. wird die Zeile 102,p2,yes von impo1.csvverarbeitet und dann wird eine Aktualisierung auf expo1.csv- vorgenommen p2_1,yes.)

expo1.csvnach Änderungen:

102,GROSSARTIG,Adjektiv,ENG,p1_0,nein,p2_1,ja,p3,nein,4,ja,p5_2,nein,p6,ja...,su1,amb,su_09,nein

104,BHAAG,Verb,HIN,p1,nein,p2,nein,p3_7,amb,p4,nein,p5,nein,p6_9,ja...,sg4_3,ja,su119,amb

110,.........,su11_0,nein

Nachdem das Skript die Änderungen vorgenommen hat, müssen wir nun durch Vergleichen der Dateien impo1 und expo1 überprüfen, ob die Änderungen richtig vorgenommen wurden. Und hier stecke ich fest.

Bisher konnte ich die Daten zwischen den Kommas impo1.csvseparat in Variablen isolieren, indem ich Folgendes verwendete awk:

Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no

Nun stellt sich die Frage, wie ich das überprüfen kann. Die impo1.csvDateien enthalten etwa 3000 Updates. Wenn ich dies tue grep p1 expo1.csv|grep no expo1.csv, wird offensichtlich nicht das richtige Ergebnis zurückgegeben, da die Datei viele „Nein“-Zeichenfolgen enthält. Ich habe versucht, die Daten mithilfe einer For-Schleife in separate Variablen aufzuteilen awkund dann mit einem Platzhalter zu grepen – grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csvaber das funktioniert nicht.

Verwende GNU Bash 4.1.2.

BEARBEITEN – Das hätte ich früher erwähnen sollen, mein Fehler – Es gibt keine klaren Muster in der Datei impo1.csv, anhand derer ich die Datei expo1 überprüfen kann. Ich habe Korrekturen am Inhalt der Beispieldatei vorgenommen, die meinen Standpunkt verdeutlichen.

Antwort1

Die Lösung ist ziemlich einfach. Sie müssen nur ein Muster aus jeder Zeile erstellen impo1.csvund grepes dann nach expo1.csvdem Aktualisieren

validate() {
    # $1 ~ impo1.csv
    # $2 ~ expo1.csv after changes
    while read pattern; do
        grep -q "^$pattern" $2 || return 1
    done < <(sed "s/,/,.*/" $1 )
}

Antwort2

awk -F, '
    NR==FNR{
        for(i=1;i<NF;i)
            DATA[$1 SUBSEP $++i] = $++i;
        next
    }
    DATA[$1 SUBSEP $2] != $3
    ' expo1.csv impo1.csv

druckt Zeilen, impo1.csvdie sich von den Daten inexpo1.csv

verwandte Informationen