Добавьте элементы из 2 строк в зависимости от состояния шаблона. - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу добавить 2 строки на основе шаблона

У меня есть эта таблица

1        -         513        1478          966        1  
2        -        1594        2130          537        1  
3        +        2171        2539          369        1  
4        -        2587        3159          573        1

Что я ищу, так это добавление столбца $ 7, в котором первый элемент начинается с 0 и если $ 2 равен «-», то вычтите -1 из $ 7, иначе добавьте +1 к $ 7 следующим образом:

1        -         513        1478          966        1     -1  
2        -        1594        2130          537        1     -2  
3        +        2171        2539          369        1     -1  
4        -        2587        3159          573        1     -2  `

Я написал это

awk '$7==0,i=1;{for i in $1 do {if($2="-"){$7=$7+1}else{$7=$7-1} done print}'

Проблема с моим кодом что, если я уберу условие for, все $ 2 превратятся в - и все $ 7 будут -1

Ответы [ 3 ]

2 голосов
/ 10 февраля 2020

с помощью трюка @ RavinderSingh13

$ awk '{print $0 "\t" (c+=$2"1")}' file

1        -         513        1478          966        1        -1
2        -        1594        2130          537        1        -2
3        +        2171        2539          369        1        -1
4        -        2587        3159          573        1        -2
2 голосов
/ 10 февраля 2020

Ваш код не работает вообще. Это жалобы на пару синтаксических ошибок. В любом случае, я думаю, что вы переосмысливаете проблему. Если я не понял вас неправильно, решение будет проще:

awk 'BEGIN {v=0} {if ($2=="-") {v=v-1} else {v=v+1}; $7=v; print}'

Используйте переменную v, чтобы сохранить последнее значение и добавить или вычесть одно в зависимости от содержимого $2. После обновления v присвойте его $7 и распечатайте всю запись. В следующей строке у вас уже есть последнее значение седьмого столбца в v.

1 голос
/ 10 февраля 2020

Это должно быть просто так:

awk 'BEGIN{OFS="\t\t"} {$2=$2"1";$(NF+1)=$2*$NF+prev;prev=$NF} 1' Input_file

Краткое объяснение:

  • Добавление 1 к $2 2-е значение поля каждой строки.
  • Умножение значения $2 на последнее поле (что означает умножение 1 на + ve или -ve на последнее поле) и сохранение его значения во вновь созданном последнем field.
  • Теперь добавляем в него значение последнего поля предыдущей строки в соответствии с вопросом OP.
  • Сохранение текущего последнего поля (нового, созданного с помощью $(NF+1)) в переменной prev, чтобы его можно использовать для добавления в вычисления следующей строки.

Подробное объяснение:

awk '                   ##Starting awk program from here.
BEGIN{                  ##Starting BEGIN section of this awk program from here.
  OFS="\t\t"            ##Setting value of 2 times TAB for each line here.
}                       ##Close BEGIN section of this code here.
{
  $2=$2"1"              ##Concatenating 1 to value of $2 here.
  $(NF+1)=$2*$NF+prev   ##Creating new last field whose value is $2*$NF and adding prev variable to it.
  prev=$NF              ##Setting current last field value to variable prev here.
}
1                       ##Printing edited/non-edited lines here.
'  Input_file           ##mentioning Input_file name here.

Вывод будет следующим для предоставленные образцы.

1       -1      513     1478        966     1       -1
2       -1      1594        2130        537     1       -2
3       +1      2171        2539        369     1       -1
4       -1      2587        3159        573     1       -2
...