[英]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
它捕獲最后一列並使用 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
如果您可以制作立即刪除的數據文件的副本(即,如果您的數據文件很大,則不要使用),使用awk
(閱讀和使用)會容易得多。
嘗試:
: ! awk '{ $NF=$NF*(0.1 * NR); print}' data_file > tmp && mv tmp data_file
使用!
在終端中運行 Vim 之外的命令。 然后對於data_file
每一行, awk
用自身乘以(0.1 * NR)
替換最后一列$NF
,其中NR
是行號。 你可以用任何你想要的數學邏輯來改變它。 然后它會打印您的修改的整行。
現在,您只需要將此輸出存儲在臨時文件tmp
,然后用修改后的數據覆蓋您的data_file
,即mv
命令。
Vim 會要求你重新加載文件,你應該加載新修改的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.