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

Vim multiply column of numbers by series of numbers

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

10  1  -0.93
11  1  -0.93
12  1  -0.93
13  1  -0.93
...

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

我想通过将每个数字乘以 0.10.20.3 等来替换最后一列数字,结果是

10  1  -0.093
11  1  -0.186
12  1  -0.279
13  1  -0.372
...

我知道我可以使用 = 寄存器进行数学计算(这是正确的术语吗?),但我似乎无法弄清楚如何自动执行此操作。请指教

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

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

捕获最后一列和 return 使用
的“值 * 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

如果您可以制作立即删除的数据文件的副本(即,如果您的数据文件很大,则不要使用),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会要求你重新加载文件,你应该在新修改的数据中加载。