2016-04-26 7 views
0

Ich habe ein tägliches Skript, das ein Fehlerprotokoll extrahieren und Benutzer aus der Master-CSV-Datei entfernen muss, bevor Sie in die Datenbank hochladen. Ich bin in der Lage, awk zu verwenden, um die erste Spalte mit großartigen Ergebnissen zu extrahieren. Der Fehler, den ich von meiner Drittanbieter-Anwendung erhalte, enthält jedoch ein Komma in der Fehlerspalte. Dies verhindert eine genaue Übereinstimmung und verursacht Probleme.Übereinstimmendes Muster mit einem Komma in csv-Spalte eingebettet

Dies ist ein Beispiel der Fehlerdatei für mich zurück

"USER_ID","FIRSTNAME","LASTNAME","ERROR" 
"CA781558","Dani","Roper","parent is inactive, cannot update record" 
"BT055163","Alexis","Richardo","parent is inactive, cannot update record" 
"LN764767","Peter","Rajosz","no parent record, update denied" 
"SG839717","Jerry","Alindos","parent is inactive, cannot update record" 

ich genau übereinstimmen muß „Elternteil inaktiv ist, kann nicht Datensatz aktualisieren“, diese zu verwenden, um die übergeordnete Datensatz zu aktualisieren, so es kann aktualisiert werden. Ebenso muss ich die "keine übergeordnete Datensatz" übereinstimmen, so dass ich ein Elternteil für diesen Datensatz hinzufügen und verarbeiten kann. In Wirklichkeit habe ich eine Reihe ähnlicher Fehlermeldungen, die unterschiedliche Aktionen erfordern. Die Übereinstimmung mit der genauen Zeichenfolge und dem Komma ist kritisch.

Die erwartete Ausgabe lautet:

"USER_ID" 
"CA781558" 
"BT055163" 
"SG839717" 
+1

Verwenden Sie eine Sprache mit einem richtigen CSV-Parser. – chepner

Antwort

1

awk Verwenden Sie können dies tun:

s='parent is inactive, cannot update record' 
awk -v s="\"$s\"" -F, 'NR==1 || $0 ~ s{print $1}' file 

"USER_ID" 
"CA781558" 
"BT055163" 
"SG839717" 
0

Ich würde mit einem richtigen CSV-Parser. Es folgt ein Beispiel, das das Kernmodul Text::ParseWords verwendet, sodass Sie es nicht von CPAN herunterladen müssen.

perl -MText::ParseWords -lne ' 
    @line = parse_line(",", 1, $_); 
    print $line[0] if $.==1; 
    print $line[0] if $line[3] =~ /parent is inactive, cannot update record/; 
' file 
"USER_ID" 
"CA781558" 
"BT055163" 
"SG839717" 
1

Ganz einfach verwenden (awk ist übertrieben für diesen Zweck):

cat infile.txt | grep 'parent is inactive, cannot update record' | cut -d ',' -f1 
Verwandte Themen