2017-03-12 3 views
1

Ich habe eine awk mit regex Begrenzer ich Wort von Vorname und Nachname extrahieren müssen, aber dieser Befehl funktioniert nichtWie könnte ich mehrere Trennzeichen Wort mit awk drucken?

 awk -v OFS="\t" -v FS='firstName": "|",[^+]*lastName": "|", "' '{sum[$1]+=$2;} {print $1,$2}' sumacomando 

"firstName": "gdrgo", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "lastName": "222",dfg 
 
"xxxxx": "John", "firstName": "beto", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "lastName": "111","xxxxx": "John", 
 
"xxxxx": "John", "firstName": "beto", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "lastName": "111","xxxxx": "John", 
 
"xxxxx": "John", "xxxxx": "John", "firstName": "beto2", "xxxxx": "John","lastName": "555", "xxxxx": "John","xxxxx": "John", 
 
"xxxxx": "John", "xxxxx": "John", "firstName": "beto2", "xxxxx": "John","lastName": "444", "xxxxx": "John","xxxxx": "John", 
 
"firstName": "gdrgo", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "lastName": "222",dfg 
 
"xxxxx": "John", "xxxxx": "John", "firstName": "beto2", "xxxxx": "John","lastName": "444", "xxxxx": "John","xxxxx": "John",

I

gdrgo,222 
 
beto,111 
 
beto,111 
 
beto2,555 
 
beto2,444 
 
gdrgo,222 
 
beto2,444
drucken müssen

bitte helfen Sie mir

+1

uns zeigen, was Sie bisher versucht haben. Auch warum bist du entschlossen, dies mit Awk zu tun? –

+0

Ja, ich habe einen Beitrag gelesen, der möglich ist, mehrere Delimiter zu verwenden, aber ich weiß nicht, warum mein Befehl nicht funktioniert – victorhernandezzero

+0

awk -v OFS = "\ t" -v FS = 'Vorname': "|", [^ +] * Nachname " : "|", "'' {sum [$ 1] + = $ 2;} {print $ 1, $ 2} 'sumacomando – victorhernandezzero

Antwort

2

Ihre Eingabe eine CSV ist so die Art und Weise zu handhaben GNU awk for FPAT ist, und die Ausgabe ist auch eine CSV so OFS auf eine Registerkarte Einstellung würde Sinn nicht machen. Wenn Sie JEDE Datei haben, die name-> value-Mappings enthält, ist es am einfachsten und robustesten, zuerst ein Array dieser Mappings zu erstellen (f[]) und dann Ihre Daten unter Verwendung ihrer Namen zu drucken oder anderweitig zu manipulieren :

$ cat tst.awk 
BEGIN { 
    FPAT = "([^,]*)|(\"[^\"]+\")" 
    OFS = "," 
} 
{ 
    delete f 
    for (i=1; i<=NF; i++) { 
     split($i,t,/[[:space:]":]+/) 
     f[t[2]] = t[3] 
    } 
    print f["firstName"], f["lastName"] 
} 

$ awk -f tst.awk file 
gdrgo,222 
beto,111 
beto,111 
beto2,555 
beto2,444 
gdrgo,222 
beto2,444 
-1

dieser Befehl funktioniert

awk -v OFS='"' -v FS='Name": "' '{i = index($3, "\"");i2 = index($4, "\""); print substr($3, 0, i) ";" substr($4, 0, i2) }' sumacomando 
 
gdrgo,222 
beto,111 
beto,111 
beto2,555 
beto2,444 
gdrgo,222 
beto2,444 
+0

Dieser Beitrag ist keine Antwort und scheint völlig unabhängig von deiner Frage zu sein. Als solches sollten Sie es löschen, so dass es nicht nur hier verweilt, keinen Wert hinzufügt und downvotes sammelt. –

+0

Ich habe in diesem Post, dass nicht die Antwort ist, ich wollte Ihnen nur eine Vorstellung davon geben, wie Sie – victorhernandezzero

+0

beheben konnte ich den Befehl korrigieren – victorhernandezzero

Verwandte Themen