使用perldo计算文件中的数字差异

时间:2013-05-21 18:33:03

标签: perl vim

我有一个带两个数字的文件

4     4
4      4
9         8
7     7

每一行可能有不同数量的空格。 我想要做的是使用perldo来计算两个数字的差异:

我现在正在尝试

:perldo @a=split(/ +/, $_); $_ =  $a[0] - $a[1]

我认为这应该有效,但文件根本没有改变。

我怎样才能使用perldo?

5 个答案:

答案 0 :(得分:4)

要使替换成功,perldo行必须返回true:如果返回false(或其他“伪造”值,例如0),则更改将被丢弃。

这就是为什么当行中的两个数字相同时,代码不能正确改变行:减法的结果为0,因此结果被丢弃。但是,这可以工作

:perldo @a=split(/ +/, $_); $_ = $a[0] - $a[1]; 1

我会以不同的方式写它

:perldo s/(\S+)\s+(\S+)/$1-$2/e

但这可能是一种风格问题。

答案 1 :(得分:3)

我对perl知之甚少,但这可以在这里工作:

:perldo @a=split(/ +/, $_); $_ =  $a[0] - $a[1]; print $_

因为您在vim中编辑文件,所以您可以考虑以vim方式执行此操作:

:%s/\v(\d+)\s*(\d+)/\=submatch(2)-submatch(1)

答案 2 :(得分:3)

强制性的awk解决方案

:%!awk '{print $1-$2}'

答案 3 :(得分:0)

壳牌单线:

perl -ne 'if ( /(\d+)(\s+)(\d+)/ ) { print $1 - $3,":$1-$3\n";}' afile.txt 

答案 4 :(得分:0)

从未听说过perldo,但Perl本身似乎很容易或更容易:

perl -lane 'print $F[0]-$F[1]' file.txt > output.txt

或者您可以使用就地编辑

perl -i -lane 'print $F[0]-$F[1]' file.txt 

备份:

perl -i.bak -lane 'print $F[0]-$F[1]' file.txt 

-a开关在空格上自动分割,-n开关处理输入(文件/标准输入),-l处理行结尾。