awk eller grep? – udskriv nøgleord og følgende kolonner

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 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *