Не могли бы вы попробовать один раз.
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
Проблема ваших усилий: Почему эти значения добавляются, даже если вы поместили их в -
ve скажем, первый элемент пришел для a[test,$2]=100
, поскольку его значение равно NULL в в самый первый раз, поэтому он станет a[test,$2]=-100
, теперь снова он выполняет вычитание с предыдущим значением a[test,$2]
, поэтому -100
и -10
теперь станут -110
. Вот почему он продолжает добавляться к своим значениям индексов.
Чтобы избежать этой проблемы: Чтобы избежать этого, вы можете использовать символы подстановки, такие как ?
и :
, где операторы, сопровождаемые ?
, будут выполняться, когда условие TRUE и операторы после :
будут выполняться, когда предоставленное нами условие FALSE.
Итак, в этом я дал:
a[$1,i]=a[$1,i]==""?a[$1,i]-$i:$i
, что означает, что он проверит, присутствует ли уже значение массива a с индексом $1,i
, затем вычтет его с уже существующим значением, иначе оставит его положительным, как есть (что произойдет в самый первый раз, когда значение поступит в массив).