AWK - 将正负值求和到单独的变量中

AWK - 将正负值求和到单独的变量中

我有一个CSV这样的文件:

2019.04.15;3.75;
2019.04.29;-5.17;
2019.05.01;7.5;
2019.05.06;0.5;
2019.05.13;0.25;
2019.05.20;-8.5;

我想获得第二列中的plus和值的总和。minus

我通过以下pipe使用awk和解决了这个问题grep

plus=$(awk -F';' '{print $2};' "$file" |
      grep --invert-match "-" |
      awk '{s+=$1}END{print s}'
)

minus=$(awk -F';' '{print $2};' "$file" |
      grep "-" |
      awk '{s+=$1}END{print s}'
)

我很确定awk他可以通过使用一个命令自己完成它,问题是它会是什么样子?

答案1

加:

awk -F';' '$2~/^[^\-]/{s+=$2} END{print s}'  data

减:

awk -F';' '$2~/^[\-]/{s+=$2} END{print s}'  data

答案2

$ set -f; IFS=" " 
$ set $(perl -F\; -lane '$A[$F[1]<0] += $F[1]}{print "@A"' "$file") 
$ plus=$1 minus=$2

答案3

另一种awk解决方案:

awk -F\; 'BEGIN {plus=0;minus=0} 
{if ($2>0) plus+=$2; else minus+=$2; } 
END {minus=-minus; print plus minus}' input_filename

相关内容