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