Obtendo dados abaixo ou acima de uma linha

1

Este é o meu arquivo:

print energy 1 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol

print energy 2 end
  Local net energy (PE 0) = 1.682997967326E+05 kJ/mol
  Global net ELEC energy = 1.682997967326E+05 kJ/mol

Eu preciso dos números, mas a única maneira de saber qual deles é para mim é a linha print . Até agora, usei este comando para resolver:

tail -16 file.txt | head -1 | awk '{print $6}'

Mas este caminho não é bom, eu acredito. Você tem que confiar no número da linha. Se os dados estiverem no meio de mil linhas, você estará perdido. Você conhece alguma melhor escolha para isso?

    
por Ooker 29.05.2014 / 10:22

4 respostas

4

Supondo que você queira imprimir o campo 6 th da segunda linha depois de cada um contendo print (adivinhação), você pode usar:

awk '/print/{if (getline > 0 && getline > 0) print $6}'

Ou:

awk '!--n {print $6}; /print/ {n=2}'

Se você quiser o último campo na primeira linha contendo Global que ocorre após a primeira ocorrência de print energy 1 end , isso seria:

awk '/print energy 1 end/{found=1}; found && /Global/ {print $(NF-1); exit}'

Para imprimir dados das linhas acima da partida, você precisará primeiro gravar os dados e depois imprimir os dados gravados durante a partida. Por exemplo, para imprimir o sexto campo da linha antes do primeiro que contém print :

awk '/print/{print recorded;exit};{recorded=$6}'
    
por 29.05.2014 / 13:07
1

Com seus dados de amostra, aqui está uma solução GNU grep :

$ grep -oP '(?<== ).+? ' file
1.635393034217E+05 
1.635393034217E+05 
1.682997967326E+05 
1.682997967326E+05
    
por 29.05.2014 / 10:33
1

Você também pode usar o corte:

cut -d "=" -f2 file

E se você não quiser o "kJ / mol", em seguida, canalizar com awk:

cut -d "=" -f2 file | awk '{print $1}'
    
por 29.05.2014 / 10:43
1

Eu assumi que todas as instruções de impressão estão separadas por uma linha em branco e também assumi que você deseja imprimir o sexto campo da segunda linha depois de cada uma contendo impressão.

$ cat ccc
print energy 1 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol

print energy 2 end
  Local net energy (PE 0) = 1.682997967326E+05 kJ/mol
  Global net ELEC energy = 1.682997967326E+05 kJ/mol

Read energy 3 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol


$ awk -v RS='\n\n' '/print/{gsub (/\n/,""); {print $18}}' ccc
1.635393034217E+05
1.682997967326E+05
    
por 30.05.2014 / 02:38