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