任何主意我在此语句中做错什么,因为我用+ =代替了+ =? 这个想法是求和或减去匹配的行。 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
答案 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。