Сделайте операцию в переменной, прежде чем печатать вывод - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу применить условие к переменной внутри процесса awk.

Как добавить приведенные ниже условия в код, чтобы не было возможности выполнять операции с переменными значения (x1) и (x2) передраспечатать выходной файл.

  #if{(x1>101) x1="AAA"}
  #if{(x2>104) x2="BBB"}

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

входной файл

3141 37150 100 10100 1 4
3141 37201 100 12100 1 4
3144 37471 100 14100 2 5
3141 37471 100 14100 0 6
3141 37471 100 14100 5 6
3141 37471 100 14100 1 7
3142 37471 100 14100 3 8
3143 37471 100 14100 1 1

Код, который я использую

awk '{
    tt1 = $1
    tt2 = $2
        tt3 = $3
    tt4 = $4
    tt5 = $5
    tt6 = $6
    x1 = tt3 + tt5
    x2 = tt3 + tt6 
    x3 = tt3 + tt2 

  #if{(x1>101) x1="AAA"}
  #if{(x2>104) x2="BBB"}

    x6 = x3 + 5000                       
    printf("%5d %5d %5d %5d %5d %5d %5d %5d %5d %5d\n", tt1,tt2,tt3,tt4,x1,x2,x3,tt5,tt6,x5)}' file1 | awk -v OFS=',' '{$1=$1}1' 

выходной файл

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,102,105,37571,2,5,42571
3141,37471,100,14100,100,106,37571,0,6,42571
3141,37471,100,14100,105,106,37571,5,6,42571
3141,37471,100,14100,101,107,37571,1,7,42571
3142,37471,100,14100,103,108,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571

желаемый вывод

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571

Заранее спасибо

1 Ответ

0 голосов
/ 23 февраля 2019

Хотя я знаю, что вы просите улучшить свой код.ИМХО лучшим подходом будет использование функции printf, и вы можете избежать использования слишком большого количества переменных, если они есть, только если у вас нет большой программы, в которой нам может понадобиться использовать эти переменные (которые мы получаем из значений столбцов / полей) позжев программе.

awk '{printf("%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n",\
      $1,$2,$3,$4,\
      $3+$(NF-1)>101?"AAA":$3+$(NF-1),\
      $3+$NF>104?"BBB":$3+$NF,\
      $2+100,$5,$6,$2+5000+$3)
}'  Input_file

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

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571


РЕДАКТИРОВАТЬ: Исправлена ​​попытка OPздесь.

ИСПРАВЛЕНО решение кода OP следующим образом:

awk '{
    tt1 = $1
    tt2 = $2
    tt3 = $3
    tt4 = $4
    tt5 = $5
    tt6 = $6
    x1 = tt3 + tt5
    x2 = tt3 + tt6 
    x3 = tt3 + tt2 
    x5=  x3 + 5000
  if(x1>101){x1="AAA"}
  if(x2>104){x2="BBB"}
    printf("%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n", tt1,tt2,tt3,tt4,x1,x2,x3,tt5,tt6,x5)}'  Input_file

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

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571

Проблемы ИСПРАВЛЕНЫ в коде OP:

1 - Удалено %5d и изменено значение на %d, чтобы удалить ненужные пробелы из десятизначной печати. ​​

2 - исправлены разделители в printf, между которыми они поменялись на ,.

3- Удалена переменная x6, кажется, что НИКОГДА не использовалась, и изменила ее на x5.

4 - изменен if синтаксис условия.Кажется, синтаксис НЕ был правильным, поскольку он был изменен с if{.....) на if(....).

5 - Удалено лишнее awk, которое НЕ использовалось после вышеуказанных изменений в коде.

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