簡體   English   中英

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

它捕獲最后一列並使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM