Jeg lavede nogle benchmarks, og output er en enkelt fil, der indeholder flere resultater med følgende format
[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
Jeg vil kun hente driftstiderne for de forskellige kørsler, jeg har foretaget. Så er det muligt at gribe “Time” og udskrive den næste, men en kolonne? Eller endda kun udskrive
1.02 1.22
til mit eksempel ovenfor? Jeg foretrækker kun at udskrive de tre resultatkolonner uden blaa-delen: D
Kommentarer
- Du mener den samme kolonne, næste men en linje ?
Svar
Antager vi Time
er altid i det sjette felt:
$ awk "$6 == "Time" {t = NR} t && NR == t+2 {print $6}" file 1.02 1.22
Alternativt kan du bruge getline
to gange – hurtigt “n” beskidt :
awk "$6 == "Time" {getline; getline; print $6}" file
(“beskidt”, fordi det ikke kontrollerer getline
returværdien).
Kommentarer
- Eller brug
$NF
hvis det altid ' sidste kolonne. - @Kusalananda ja godt punkt
Svar
$ 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
Resultaterne er adskilt af --
i den sidste grep, som kan fjernes med:
$ grep -A2 ^T/V file | grep -v "^--"
Og med ====
linjer fjernet :
$ grep -A2 ^T/V file | grep -v "^--\|=\+"
Svar
Du fik to svar ved hjælp af awk and grep
, du kan også prøve sed
:
sed -E "/===*/{N;s/.*([0-9]+\.[0-9]*)/\1/g};t;d" file_name
Her /===*/
, matcher ===..
, så går den til næste linje og finder flydende tal med decimal mellem dem og springer over og sletter alle andre linjer.
Det udskriver output som:
1.02 1.22