awk of grep? – print trefwoord en volgende kolommen

Ik heb een aantal benchmarks gedaan en de output is een enkel bestand met meerdere resultaten met het volgende formaat

[blaaa] 1st run T/V N NB P Q Time ========================== 2 3 4 1 2 1.02 [blaaaa...] 2nd run T/V N NB P Q Time ========================== 4 42 4 1 2 1.22 

Ik wil alleen de looptijden ophalen van de verschillende runs die ik heb gemaakt. Is het dus mogelijk om “Tijd” te grepen en de op één na volgende kolom af te drukken? Of zelfs om alleen af te drukken

1.02 1.22 

voor mijn voorbeeld hierboven? Ik zou liever alleen de drie resultaatkolommen afdrukken zonder het blaa-gedeelte: D

Opmerkingen

  • Je bedoelt dezelfde kolom, op één na line ?

Antwoord

Ervan uitgaande dat Time staat altijd in het zesde veld:

$ awk "$6 == "Time" {t = NR} t && NR == t+2 {print $6}" file 1.02 1.22 

Je kunt ook getline twee keer gebruiken – snel “n” vuil :

awk "$6 == "Time" {getline; getline; print $6}" file 

(“dirty” omdat het de getline retourwaarde niet “controleert).

Reacties

  • Of gebruik $NF als het ' altijd is de laatste kolom.
  • @Kusalananda ja goed punt

Antwoord

$ grep -o "Time\|[0-9\.]\+$" file Time 1.02 Time 1.22 $ grep -o "[0-9\.]\+$" file 1.02 1.22 $ grep -A2 ^T/V file T/V N NB P Q Time ========================== 2 3 4 1 2 1.02 -- T/V N NB P Q Time ========================== 4 42 4 1 2 1.22 

De resultaten worden gescheiden door -- in de laatste grep die kan worden verwijderd met:

$ grep -A2 ^T/V file | grep -v "^--" 

En met de ==== regels verwijderd :

$ grep -A2 ^T/V file | grep -v "^--\|=\+" 

Antwoord

Je hebt twee antwoorden met awk and grep, je kunt ook sed proberen:

sed -E "/===*/{N;s/.*([0-9]+\.[0-9]*)/\1/g};t;d" file_name 

Hier /===*/, zal overeenkomen met ===.., dan zal het naar de volgende regel gaan en drijvende-kommagetallen vinden met een decimaal ertussen, en alle andere regels overslaan en verwijderen.

Het zal uitvoer afdrukken als:

1.02 1.22 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *