awk 或 sed 列内的算术运算

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 解决方案是首选。

Sté*_*las 6

你可以使用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)

在所有四个中,我们正在寻找数字-+字符序列并将它们传递给解释器的算术处理器(evalin perl(或ee导致替换扩展被评估为perl代码的标志),$((...))in zsh)。

我们在传递给解释器之前没有验证表达式,所以它可能会导致失败(例如在像-+-or这样的序列上3++)但至少,因为我们只考虑数字和-/+字符,它不应该比报告错误消息并中止命令。