我有一个包含两个数字的文件
4 4
4 4
9 8
7 7
每行可能有不同数量的空格。我想做的是perldo
用来计算两个数字的差异:
我现在正在尝试
:perldo @a=split(/ +/, $_); $_ = $a[0] - $a[1]
我认为这应该可行,但文件根本没有改变。
如何使用 perldo 做到这一点?
要使替换成功,perldo 行必须返回true
:如果false
返回(或其他“假”值,例如 0),则丢弃更改。
这就是为什么当行中的两个数字相同时,您的代码无法正确更改行:减法的结果为 0,因此结果被丢弃。但是,这有效
:perldo @a=split(/ +/, $_); $_ = $a[0] - $a[1]; 1
我会以不同的方式写它
:perldo s/(\S+)\s+(\S+)/$1-$2/e
但这可能是风格问题。
我对 perl 了解不多,但是这在这里有效:
:perldo @a=split(/ +/, $_); $_ = $a[0] - $a[1]; print $_
由于您在 vim 中编辑文件,您可以考虑以 vim 方式进行编辑:
:%s/\v(\d+)\s*(\d+)/\=submatch(2)-submatch(1)
强制 awk 解决方案
:%!awk '{print $1-$2}'
壳牌一号线:
perl -ne 'if ( /(\d+)(\s+)(\d+)/ ) { print $1 - $3,":$1-$3\n";}' afile.txt
从未听说过 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
处理行尾。