awk o grep? – parola chiave print e colonne seguenti

Ho fatto alcuni benchmark e loutput è un singolo file contenente più risultati con il seguente formato

[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 

Voglio solo ottenere i tempi di esecuzione delle diverse esecuzioni che ho eseguito. Quindi è possibile grep “Time” e stampare la colonna successiva tranne una? O anche solo per stampare

1.02 1.22 

per il mio esempio sopra? Preferirei stampare solo le tre colonne dei risultati senza la parte blaa: D

Commenti

  • Intendi la stessa colonna, la successiva ma una riga ?

Risposta

Supponendo Time è sempre nel sesto campo:

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

In alternativa puoi usare getline due volte – quick “n” dirty :

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

(“dirty” perché “non controlla il valore restituito getline).

Commenti

  • Oppure utilizza $NF se ' è sempre l ultima colonna.
  • @Kusalananda sì buon punto

Risposta

$ 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 

I risultati sono separati da -- nellultimo grep che può essere rimosso con:

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

E con le ==== righe rimosse :

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

Risposta

Hai ottenuto due risposte utilizzando awk and grep, puoi anche provare sed:

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

Qui /===*/, corrisponderà a ===.., quindi passerà alla riga successiva e troverà i numeri in virgola mobile che hanno un decimale tra di loro e salterà ed eliminerà tutte le altre righe.

Stamperà un output come:

1.02 1.22 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *