Как назначить другое значение переменной для другого оператора if - PullRequest
1 голос
/ 18 апреля 2019

У меня есть текстовый файл с 4 столбцами.Мне нужно изменить файл так, чтобы первая последовательность 1 в 4-м столбце оставалась 1, но все остальные значения в 4-м столбце должны быть изменены на 0.

Я пробовал следующую команду awk с несколькими операторами ifно переменная fat, похоже, не обновляется должным образом.

`cat sample_data.txt`

72  29  16  0   <br>
73  30  16  0   <br>
74  31  16  0   <br>
75  32  16  1   <br>
76  33  16  1   <br>
77  34  16  1   <br>
78  35  16  0   <br>
79  36  16  0   <br>
80  37  16  0   <br>
81  38  16  0   <br>
82  39  16  0   <br>
83  40  16  0   <br>
84  41  16  0   <br>
85  42  16  0.55    <br>
86  43  16  0.57    <br>
87  44  16  0.41    <br>
88  45  16  0.58    <br>
89  46  16  1   <br>
90  47  16  1   <br>
91  48  16  1   <br>
92  49  16  1   <br>
93  50  16  0.59    <br>
94  51  16  0.52    <br>
95  52  16  0.43    <br>


`awk -v fat=1 '{if($4<1 && fat=1) {print $1,$2,$3,0;} else if($4=1 && fat=1) {fat=2;print $1,$2,$3,1;} else if($4=1 && fat=2) {fat=2;print $1,$2,$3,1;} else if($4<1 && fat=2) {fat=3;print $1,$2,$3,0} else if($4<1 && fat=3) {fat=3;print $1,$2,$3,0;} else if($4=1 && fat=3) {fat=3;print $1,$2,$3,0;}}' sample_data.txt`

Я хочу вывод:

72  29  16  0   <br>
73  30  16  0   <br>
74  31  16  0   <br>
75  32  16  1   <br>
76  33  16  1   <br>
77  34  16  1   <br>
78  35  16  0   <br>
79  36  16  0   <br>
80  37  16  0   <br>
81  38  16  0   <br>
82  39  16  0   <br>
83  40  16  0   <br>
84  41  16  0   <br>
85  42  16  0   <br>
86  43  16  0   <br>
87  44  16  0   <br>
88  45  16  0   <br>
89  46  16  0   <br>
90  47  16  0   <br>
91  48  16  0   <br>
92  49  16  0   <br>
93  50  16  0   <br>
94  51  16  0   <br>
95  52  16  0   <br>

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

по вашему коду:

if($4<1 && fat=1)

fat=1 - это присвоение, вместо этого проверка эквивалентности будет fat==1 (двойное равенство).

Но в любом случае, вот как можно сделать то, что вы хотите, с помощью простого FSM :

$ awk '(state==0) && ($4==1){state=1} (state==1) && ($4!=1){state=2} state==2{$4=0} 1' file
72 29 16 0
73 30 16 0
74 31 16 0
75 32 16 1
76 33 16 1
77 34 16 1
78 35 16 0
79 36 16 0
80 37 16 0
81 38 16 0
82 39 16 0
83 40 16 0
84 41 16 0
85 42 16 0
86 43 16 0
87 44 16 0
88 45 16 0
89 46 16 0
90 47 16 0
91 48 16 0
92 49 16 0
93 50 16 0
94 51 16 0
95 52 16 0
0 голосов
/ 24 апреля 2019

пробовал на GNU AWK:

awk -vf=1 '$4==1&&(f||s){f=0;s=1;$4=0;print;next} {s=0}1' sample_data.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...