Vim 将一列数字乘以一系列数字

时间:2021-07-27 16:18:41

标签: math vim

我的文本文件中有一个数字列,如下所示:

import numpy as np
inpdata=np.load("test.npy",allow_pickle=True).item()
data1=inpdata['data']

for colms in data1:
    np.ma.masked
    

(第一列数字不是行号。)

我想通过将每一列乘以 10 1 -0.93 11 1 -0.93 12 1 -0.93 13 1 -0.93 ... 0.10.2 等来替换最后一列数字,结果是

0.3

我知道我可以使用 10 1 -0.093 11 1 -0.186 12 1 -0.279 13 1 -0.372 ... 寄存器进行数学运算(这是正确的术语吗?),但我似乎无法弄清楚如何自动执行此操作。请指教。

2 个答案:

答案 0 :(得分:5)

假设 0.1/0.2/... 对应于“行号 / 10”,您可以使用

%s/\v(\S+)$/\=str2float(submatch(1)) * line('.') * 0.1

它捕获最后一列并使用a
返回“value * line_number * 0.1”的结果 sub-replace-expression(有关详细信息,请参阅 :help sub-replace-expression)。


如果值不是从第 1 行开始,您可以使用视觉选择(设置 line("'<"))并使用 line('.') - line("'<") + 1 来了解您在块中的位置。然后添加初始乘数(此处为 0.1):

'<,'>s/\v(\S+)$/\=str2float(submatch(1)) * (line('.') - line("'<") + 1) * 0.1

答案 1 :(得分:0)

使用 awk(阅读和使用)会容易得多,如果您可以制作立即删除的数据文件的副本(即,如果您的数据文件很大,则不要使用)。

试试:

: ! awk '{ $NF=$NF*(0.1 * NR); print}' data_file > tmp && mv tmp data_file 

在终端中使用 ! 在 Vim 之外运行命令。然后,对于 data_file 中的每一行,awk 将最后一列 $NF 替换为自身乘以 (0.1 * NR),其中 NR 是行号。你可以用任何你想要的数学逻辑来改变它。然后它会打印您的修改的整行。

现在,您只需将此输出存储在临时文件 tmp 中,然后用修改后的数据覆盖您的 data_file,因此 mv 命令。

Vim 会要求您重新加载文件,您应该在新修改的数据中加载该文件。

相关问题