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.1
、0.2
、0.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会要求你重新加载文件,你应该在新修改的数据中加载。
我的文本文件中有一列数字,如下所示:
10 1 -0.93
11 1 -0.93
12 1 -0.93
13 1 -0.93
...
(第一列数字是不是行号。)
我想通过将每个数字乘以 0.1
、0.2
、0.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会要求你重新加载文件,你应该在新修改的数据中加载。