Perl 单行代码用于替换大于阈值的值

Perl 单行代码用于替换大于阈值的值

我有一个文本文件,其中包含 7 列浮点值 ()。我想使用 perl one-liner 并找到大于7th列中阈值的值。然后,我想将列值超过阈值的行中的4th, 5th, 6th,值替换为。有人可以让我知道我该怎么做吗?7th7th0.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.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 

相关内容