Использование awk минус не работает, хотя сумма работает нормально? - PullRequest
0 голосов
/ 19 ноября 2018

Есть идеи, что я делаю неправильно с этим утверждением, за минус я заменил + = на - =? Идея состоит в том, чтобы суммировать или вычитать совпадающие строки. Сумма работает нормально, минус будет просто знаком «-» перед значением, но не вычитается.

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 голосов
/ 19 ноября 2018

Так как не было ожидаемого результата, вот предположение:

$ 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, поскольку я использую двумерные массивы.

0 голосов
/ 19 ноября 2018

Не могли бы вы попробовать один раз.

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, затем вычтет его с уже существующим значением, иначе оставит его положительным, как есть (что произойдет в самый первый раз, когда значение поступит в массив).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...