dov*_*vah 3 text-processing arithmetic
我有一个文件,其列包含我想合并到算术结果的简单算术方程。
输入样本(制表符分隔的列):
+104-1+12 6 +3
Run Code Online (Sandbox Code Playgroud)
我想计算每列中的算术和。如果一列不包含算术符号,我会将其视为+
在该项目之前包含 a 。尽管+
如果列以无符号开头,则通过 sed 添加符号会很容易(sed -E 's/(\t)([0-9]*)/\1\t+\2/g'
假设行从不以数字开头,如示例中所示)
我期望的输出如下:
115 6 3
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 unix 中实现这一点?awk/sed 解决方案是首选。
你可以使用perl
:
perl -pe 's/[\d+-]+/eval$&/ge' your-file
Run Code Online (Sandbox Code Playgroud)
甚至:
perl -pe 's/[\d+-]+/$&/gee' 你的文件(感谢 Rakesh)
同zsh
:
set -o extendedglob # for the ## operator (same as ERE +)
while IFS= read -r line; do
printf '%s\n' ${line//(#m)[0-9+-]##/$((MATCH))}
done < your-file
Run Code Online (Sandbox Code Playgroud)
或者:
zmodload zsh/mapfile
set -o extendedglob
printf %s ${mapfile[your-file]//(#m)[0-9+-]##/$((MATCH))}
Run Code Online (Sandbox Code Playgroud)
在所有四个中,我们正在寻找数字-
和+
字符序列并将它们传递给解释器的算术处理器(eval
in perl
(或ee
导致替换扩展被评估为perl
代码的标志),$((...))
in zsh
)。
我们在传递给解释器之前没有验证表达式,所以它可能会导致失败(例如在像-+-
or这样的序列上3++
)但至少,因为我们只考虑数字和-
/+
字符,它不应该比报告错误消息并中止命令。