
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.csv
handelt es sich um eine Datei auf dem Server, die impo1.csv
ich zum Aktualisieren erstellt habe expo1.csv
. Ein Skript nimmt die Änderungen expo1.csv
wie in angegeben vor, impo1.csv
nachdem es eine leichte Verarbeitung der impo1-Daten durchgeführt hat (z. B. wird die Zeile 102,p2,yes von impo1.csv
verarbeitet und dann wird eine Aktualisierung auf expo1.csv
- vorgenommen p2_1,yes
.)
expo1.csv
nach Ä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.csv
separat 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.csv
Dateien 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 awk
und dann mit einem Platzhalter zu grepen – grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv
aber 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.csv
und grep
es dann nach expo1.csv
dem 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.csv
die sich von den Daten inexpo1.csv