2012-08-15 12 views
5

mam wyjście w następującym formacie:Jaki jest optymalny sposób wyodrębniania wartości między nawiasami klamrowymi w bash/awk?

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

chcę wyodrębnić dwie ostatnie cyfry w ostatniej pary szelek. Czasami w ostatniej parze aparatów ortodontycznych jest tylko jedna liczba.

To jest kod, którego użyłem.

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

Czy jest bardziej czysty sposób na wyodrębnienie wartości? lub bardziej optymalny sposób?

+1

Co masz na myśli przez czyste/optymalne? Jakie są Twoje kryteria sukcesu? –

+0

Mam na myśli bardziej profesjonalny sposób na wyodrębnienie informacji –

+3

Zmiana słowa z "optymalnego" na "profesjonalny" nie pomaga. :) –

Odpowiedz

13

Spróbuj tego:

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

To rodzaj refaktoringu Twojego polecenia.

+0

To całkiem niesamowite .. Zastanawiam się, czy OP chce przecinek jeszcze? – Levon

+0

nie chcesz przecinka –

+0

@kev, aby można było określić zestawy znaków dla separatora pól w awk? Nie wiedziałem o tym - to bardzo przydatne. – Levon

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

da

33389 94934 

Jestem nieco niejasne o znaczeniu „optymalne”/„profesjonalny” w kontekście tego problemu, ale to używa tylko jednego polecenia/narzędzia, nie jestem pewien, czy to kwalifikuje się.

Albo budynek na podejściu @ Kev jest (ale nie potrzebuje tr wyeliminować przecinek):

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

wyjścia:

33389 94934 
+0

To całkiem fajne! +1 – kev

+0

To również jest eleganckie. I przenośny (przynajmniej pierwszy)! :) +1 – ghoti

1

Można to również zrobić w czystej bash. Zakładając, że tekst zawsze wygląda próbki w pytaniu następuje powinno działać:

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

ta wykorzystuje Shell „ekspansji parametr” (które można wyszukać na stronie atakujących za człowieka) rozebrać ciąg w podobny sposób, w jaki używasz tr. Ściśle mówiąc, cytaty z drugiej linii nie są konieczne, ale pomagają w podświetlaniu składni StackOverflow. :-)

Mogłeś przemian zrobić to trochę bardziej elastyczny szukając rzeczywistej dziedzinie jesteś zainteresowany Jeśli używasz GNU awk można określić RS z wieloma postaciami.

$ 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" 

Wolę w ten sposób, ponieważ faktycznie interpretuje dane wejściowe dla tego, czym jest - tekst strukturalny reprezentujący jakąś tablicę.

Powiązane problemy