2012-08-15 8 views
5

Ich habe die Ausgabe in diesem Format:Was ist der optimale Weg, Werte zwischen geschweiften Klammern in bash/awk zu extrahieren?

Infosome - infotwo: (29333) - data-info-ids: (33389, 94934) 

Ich mag die letzten beiden Zahlen in dem letzten Paar von Klammern extrahieren. Manchmal gibt es nur eine einzige Zahl in der letzten Klammer.

Dies ist der Code, den ich verwendet habe.

echo "Infosome - infotwo: (29333) - data-info-ids: (33389, 94934)" | \ 
    tr "," " " | tr "(" " " | tr ")" " " | awk -F: '{print $4}' 

Ist ein sauberer Weg, um die Werte zu extrahieren? oder ein optimaler Weg?

+1

Was meinst du mit sauber/optimal? Was sind Ihre Kriterien für den Erfolg? –

+0

Ich meine eine professionellere Art, die Info zu extrahieren –

+3

Das Wort von "optimal" zu "professionell" zu ändern, hilft nicht. :) –

Antwort

13

Versuchen Sie folgendes:

awk -F '[()]' '{print $(NF-1)}' input | tr -d , 

Es ist eine Art von Refactoring des Befehls.

+0

Das ist ziemlich toll .. Ich frage mich, ob OP das Komma noch will? – Levon

+0

wollen kein Komma –

+0

@kev so können Sie Zeichensätze für das Feld Trennzeichen in awk angeben? Ich wusste das nicht - das ist ziemlich praktisch. – Levon

3
awk -F\('{gsub("[,)]", " ", $NF); print $NF}' input 

geben

33389 94934 

Ich bin ein wenig unklar über die Bedeutung der „optimalen“/„Profi“ in diesem Zusammenhang des Problems, aber das nutzt nur einen Befehl/Werkzeug, nicht sicher, ob das qualifiziert sich.

Oder Gebäude auf @ kev Ansatz (aber brauchen tr nicht das Komma zu beseitigen):

awk -F'[(,)]' '{print $4, $5}' input 

Ausgänge:

33389 94934 
+0

Es ist ziemlich cool! +1 – kev

+0

Dies ist auch elegant. Und tragbar (zumindest der erste)! :) +1 – ghoti

1

Dies kann auch in reiner bash erfolgen. Unter der Annahme, der Text sieht immer wie die Probe in der Frage, sollten folgende Arbeiten:

$ text="Infosome - infotwo: (29333) - data-info-ids: (33389, 94934)" 
$ result="${text/*(}" 
$ echo ${result//[,)]} 
33389 94934 

Diese nutzt Shell „Parameter Expansion“ (die Sie für den Menschen Seite in bash suchen können) in viel die Zeichenfolge Streifen die gleiche wie du es mit tr gemacht hast. Streng genommen sind die Anführungszeichen in der zweiten Zeile nicht notwendig, aber sie helfen bei der Syntax-Hervorhebung von StackOverflow. :-)

Sie könnten abwechselnd dies ein wenig flexibler gestalten, indem für die eigentliche Feld suchen Sie interessiert sind Wenn Sie GNU awk verwenden, Sie RS mit mehreren Zeichen angeben:.

$ gawk -vRS=" - " -vFS=": *" ' 
    { f[$1]=$2; } 
    END { 
    print f["data-info-ids"]; 
    # Or you could strip the non-numeric characters to get just numbers. 
    #print gensub(/[^0-9 ]/,"","g",f["data-info-ids"]); 
    }' <<<"$text" 

Ich bevorzuge diesen Weg, weil er tatsächlich die Eingabedaten für das interpretiert, was es ist - strukturierter Text, der eine Art Array darstellt.

Verwandte Themen