awk eller grep? – skriv ut nøkkelord og følgende kolonner

Jeg gjorde noen referanser, og utdataene er en enkelt fil som inneholder 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 bare hente kjøretidene til de forskjellige løpene jeg har laget. Så er det mulig å grep «Time» og skrive ut neste kolonne? Eller til og med å skrive ut bare

1.02 1.22 

for eksempelet mitt ovenfor? Jeg foretrekker å skrive ut bare de tre resultatkolonnene uten blaa-delen: D

Kommentarer

  • Du mener den samme kolonnen, neste men en linje ?

Svar

Forutsatt at Time er alltid i det sjette feltet:

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

Alternativt kan du bruke getline to ganger – raskt «n» skittent :

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

(«skitten» fordi den ikke sjekker getline returverdien).

Kommentarer

  • Eller bruk $NF hvis det alltid ' siste kolonne.
  • @Kusalananda ja bra poeng

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 

Resultatene er atskilt med -- i siste grep som kan fjernes med:

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

Og med ==== linjene fjernet :

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

Svar

Du har to svar ved å bruke awk and grep, du kan også prøve sed:

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

Her /===*/, vil samsvare med ===.., så går den til neste linje og finner flytende tall med desimal mellom dem, og hopper over og sletter alle andre linjer.

Den skriver ut som:

1.02 1.22 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *