尽管sum可以正常工作,但使用awk减号却无法正常工作?

时间:2018-11-19 12:44:00

标签: awk

任何主意我在此语句中做错什么,因为我用+ =代替了+ =? 这个想法是求和或减去匹配的行。 Sum可以正常工作,减号只会在值前加上一个“-”号,但不能减去。

awk '{for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{ for (j in a) {s=j; for (i=2;i<=NF;i++) {s=s" "a[j][i]}; print s}}'

awk '{for (i=2;i<=NF;i++) {a[$1][i]-=$i}} END{ for (j in a) {s=j; for (i=2;i<=NF;i++) {s=s" "a[j][i]}; print s}}' 
input: 
test    100     100     100     100
test2    100     90     80      0
test2    10      10     10       20
test     5       5      0       0

sum:
test2 110 100 90 20
test 105 105 100 100
minus:
test2 -110 -100 -90 -20
test -105 -105 -100 -100

2 个答案:

答案 0 :(得分:0)

请您尝试一次。

awk '
{
  for(i=2;i<=NF;i++){
    a[$1,i]=a[$1,i]==""?a[$1,i]-$i:$i
  }
  if(!b[$1]++){
    c[$1]=$1
  }
}
END{
  for(j in c){
    for(i=2;i<=NF;i++){
      val=val?val OFS a[j,i]:a[j,i]
    }
  print j,val
  delete c[j]
  val=""
  }
}'  Input_file

您的工作量问题: 为什么即使您将这些值放在-中也要添加这些值,所以可以说第一个要素是a[test,$2]=100因为它的值在第一时间为NULL,所以它将再次变为a[test,$2]=-100,并且它正在与a[test,$2]的先前值进行减法运算,因此-100-10将变为{{1 }}。这就是为什么它会不断添加到其相同的索引值的原因。

为避免该问题: 为避免这些问题,您可以使用-110?之类的通配符,其中语句后跟{{1} }将在条件为TRUE时执行,而:之后的语句将在我们提供的条件为FALSE时执行。

因此我给出了:

?

这意味着它将检查索引为:的数组a的值是否已存在,然后用其已存在的值减去它,否则保持正值(这将在值首次出现在数组中时发生) )。

答案 1 :(得分:0)

由于没有预期的输出,因此可以猜测一下:

$ awk '{
    for(i=1;i<=NF;i++)
        a[$1][i]=((a[$1][i]==""||i==1)?$i:a[$1][i]-$i) 
}
END {
    for(i in a)
        for(j=1;j<=NF;j++)
            printf "%s%s",a[i][j],(j==NF?ORS:OFS)
}' file

输出:

test2 90 80 70 -20
test 95 95 100 100

因为我使用的是二维数组,所以它用于GNU awk。