しきい値より大きい値を置き換えるPerlの1行のコード

しきい値より大きい値を置き換えるPerlの1行のコード

7つの浮動小数点値列()を含むテキストファイルがあります。 Perl one-linerを使用して、7th列のしきい値より大きい値を見つけたいと思います。次に、列の値がしきい値を超える行の、、、、4th値を置き換えようとします。誰かが私がこれを行う方法を教えてもらえますか?5th6th7th7th0.00000000

ここに例があります。しきい値が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

最初の行の列の値が7thしきい値より大きいです1.39132413 > 1.00。したがって、最初の行を次の行(0の値)に置き換える必要があり、他のすべての行は基準を満たしていないため、変更されていません。

  0.04718683      0.24081557      0.02831210      0.00000000      0.00000000     0.00000000   0.00000000

答え1

スペースをまったく同じにする必要がない場合は、次の方法を使用できます。

$ 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

特定の行数をスキップするには$.(現在の行番号)値をテストします。

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

関連情報