Excluir condicionalmente uma linha do arquivo

3

Em um arquivo que se parece com:

549.432086168
0.0000E+00 9.6988e-04 2.0580E-02
1.0000E+01 9.6988e-04 2.0580E-02
2.0000E+01 9.6988e-04 2.0580E-02
.
.
.
5.6000E+02 7.0997e-06 -3.7538E-04

Exclua a última linha se a diferença entre o número na primeira linha e a primeira coluna da última linha for maior que 10. Portanto, neste caso, a última linha será excluída, pois 560 - 549.432086168 é maior que 10.

Alguma sugestão de como isso pode ser feito com eficiência?

    
por Ketan 13.01.2016 / 18:00

2 respostas

7

Trabalho típico para awk :

awk 'NR == 1 {first = $1}; $1 - first <= 10' < file

Ou apenas para a última linha:

awk 'NR == 1 {first = last = $0; next}
     {print last; last = $0}
     END {if (NR && last - first <= 10) print last}' < file
    
por 13.01.2016 / 18:18
5

Você pode usar perl :

perl -lne '
  $n = $_ if $. == 1;
  print unless eof;
  print if $_ - $n <= 10 and eof;
' <file
  • Para a primeira linha $. == 1 , definimos seu valor como variável $n
  • Para as próximas linhas, imprima se não for a última linha
  • Imprima a última linha se a diferença entre sua primeira coluna e $n menor ou igual a 10.

Aqui usamos $_ - $n , forçando a última linha no contexto numérico, então o primeiro valor da coluna foi usado:

$ perl -le 'print "5.6000E+02 7.0997e-06 -3.7538E-04"-0'
560
    
por 13.01.2016 / 18:12

Tags