как рассчитать разницу в значениях между двумя соседними полями - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь вычислить расстояния между двумя соседними полями.Мой входной файл, как показано ниже.

1 11160 11533 11556 11731 11822 11870 12149 12411 12461 12686 12829 13315 13420 ....

В выводе я хочу сохранить первое поле, аВ следующем поле будут значения разницы между текущим полем и следующим полем, $2=$3-$2, $3=$4-$3 ...

Полный вывод будет выглядеть так:

1 37323 175 91 48 279 262 50 225 143 486 105 ...

Как я могу это сделать?

В моем коде каждое значение печатается в виде новой строки и чиселобратно напечатаны.

BEGIN {FS=" "}
{
        out[1]=$1
        for (i=2;i<=NF-1;i++) 
                out[i]=$(i+1)-$i
}
END{
        for (i in out)
               print out[i]
}

Вот токовый выход

373 23 175 91 48 279 262 50 225 143 486 105 1

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

еще awk

$ awk -v RS=' ' 'NR!=2{printf "%s ", $0-p} {p=$0}' file

1 373 23 175 91 48 279 262 50 225 143 486 105

вы можете добавить окончательный \n.

Ваша спецификация соответствует отображению всех парных разностей, кроме второй, поэтому существует NR!=2 кодПервое поле сравнивается с 0, поэтому остается неизменным.

0 голосов
/ 03 октября 2018

У вас почти есть это!Просто нужно изменить вывод с print out[i] на:

printf out[i] " "

printf не будет добавлять новую строку после каждой итерации, и вместо этого вы добавляете пробел.

ВыходЯ получил от вышеупомянутой корректировки, превращенной в:

1 373 23 175 91 48 279 262 50 225 143 486 105 

Насколько «числа не имеют смысла», они, как вы ожидаете, разница между последовательными числами.

0 голосов
/ 03 октября 2018

РЕДАКТИРОВАТЬ: Добавление кода, предложенного anubhava sir тоже в разделе комментариев.

awk '{s=$1; for (i=2; i<NF; i++) s = s OFS $(i+1) - $i; print s}' Input_file

Не могли бы вы попробовать следующее.

awk '{printf $1 OFS;for(i=2;i<NF;i++){printf("%d%s",$(i+1)-$i,i==(NF-1)?ORS:OFS)}}' Input_file

Вывод будет следующим:

1 373 23 175 91 48 279 262 50 225 143 486 105

Объяснение: Добавление объяснения тоже здесь.

awk '
{
  printf $1 OFS                                 ##Printing first field and OFS(whose value is space by default).
  for(i=2;i<NF;i++){                            ##Starting for loop from value of 2 to till NF-1 value where NF is number of field in current line.
    printf("%d%s",$(i+1)-$i,i==(NF-1)?ORS:OFS)  ##Printing diffrence of next field and current field and checking condition for 2nd print if i==NF-1 then new line else print space for that line.
  }                                             ##Closing for loop block here.
}
' Input_file                                    ##Mentioning Input_file name here.
0 голосов
/ 03 октября 2018
awk '{printf("%d",$1); for (i=2;i<NF;i++) printf(" %d",$(i+1)-$i)}' file

Выход:

1 373 23 175 91 48 279 262 50 225 143 486 105
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...