我有一个带两个数字的文件
4 4
4 4
9 8
7 7
每一行可能有不同数量的空格。
我想要做的是使用perldo
来计算两个数字的差异:
我现在正在尝试
:perldo @a=split(/ +/, $_); $_ = $a[0] - $a[1]
我认为这应该有效,但文件根本没有改变。
我怎样才能使用perldo?
答案 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
处理行结尾。