Perl one-liner para substituir valores maiores que um limiar

1

Eu tenho um arquivo de texto que contém 7 colunas de valores de ponto flutuante (). Eu gostaria de usar perl one-liner e encontrar os valores que são maiores que um limite na coluna 7th . Em seguida, desejo substituir os valores de 4th , 5th , 6th , 7th nas linhas cujo valor da coluna 7th exceder o limite com 0.00000000 . Alguém poderia me informar como eu posso fazer isso?

Aqui está um exemplo. Vamos supor que o limite é de 1,00000.

  0.04718683      0.24081557      0.02831210      0.98316791      0.00000000     -0.98446111      1.39132413
  0.05662420      0.24081557      0.02831210     -0.00006975      0.00001697     -0.00144172      0.00144350
  0.06606157      0.24081557      0.02831210      0.00039672      0.00007192     -0.00001264      0.00040339
  0.07549894      0.24081557      0.02831210      0.00087559      0.00010765     -0.00028455      0.00092694
  0.08493630      0.24081557      0.02831210      0.00004609      0.00012754     -0.00030319      0.00033214
  0.09437367      0.24081557      0.02831210     -0.00038816      0.00008384      0.00011519      0.00041348

Na primeira linha, a coluna 7th tem um valor maior que o limite, 1.39132413 > 1.00 . Portanto, a primeira linha precisa ser substituída pela seguinte (valores zero) e todas as outras linhas permanecem intactas, pois não atendem aos critérios.

  0.04718683      0.24081557      0.02831210      0.00000000      0.00000000     0.00000000   0.00000000
    
por AFP 30.09.2014 / 00:31

1 resposta

3

Se você não precisa manter o espaço em branco exatamente igual, isso funciona:

 
$ perl -lane 'do{$_=sprintf("%.8f",0) for @F[3..6]} if $F[6]>1; print "@F"' file 
0.04718683 0.24081557 0.02831210 0.00000000 0.00000000 0.00000000 0.00000000 
0.05662420 0.24081557 0.02831210 -0.00006975 0.00001697 -0.00144172 0.00144350
0.06606157 0.24081557 0.02831210 0.00039672 0.00007192 -0.00001264 0.00040339
0.07549894 0.24081557 0.02831210 0.00087559 0.00010765 -0.00028455 0.00092694
0.08493630 0.24081557 0.02831210 0.00004609 0.00012754 -0.00030319 0.00033214
0.09437367 0.24081557 0.02831210 -0.00038816 0.00008384 0.00011519 0.00041348

Para pular um certo número de linhas, basta testar o valor de $. (o número da linha atual):

$ perl -lane 'do{$_=sprintf("%.8f",0) for @F[3..6]} if $F[6]>1 && $.>3; print "@F"' file 
    
por 30.09.2014 / 00:45