awk ou grep? – imprime a palavra-chave e as colunas seguintes

Fiz alguns benchmarks e a saída é um único arquivo contendo vários resultados com o seguinte 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 

Desejo apenas obter os tempos de execução das diferentes execuções que fiz. Então, é possível usar o grep em “Tempo” e imprimir a próxima coluna? Ou até mesmo para imprimir apenas

1.02 1.22 

para meu exemplo acima? Eu preferiria imprimir apenas as três colunas de resultados sem a parte blaa: D

Comentários

  • Você quer dizer a mesma coluna, a próxima, mas uma linha ?

Resposta

Presumindo Time está sempre no sexto campo:

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

Alternativamente, você pode usar getline duas vezes – rápido “n” sujo :

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

(“sujo” porque não verifica o getline valor de retorno).

Comentários

  • Ou use $NF se ' sempre a última coluna.
  • @Kusalananda sim bom argumento

Resposta

$ 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 

Os resultados são separados por -- no último grep que pode ser removido com:

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

E com as ==== linhas removidas :

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

Resposta

Você obteve duas respostas usando awk and grep, você também pode tentar sed:

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

Aqui /===*/, corresponderá a ===.., então irá para a próxima linha e encontrará números de ponto flutuante com decimais entre eles e irá pular e excluir todas as outras linhas.

Ele imprimirá uma saída como:

1.02 1.22 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *