Awk 如何为不同的if语句为变量指定不同的值
我有一个4列的文本文件。我需要修改文件,使第4列中的第一个1序列保持为1,但第4列中的所有其他值都更改为0 我用多个if语句尝试了下面的awk命令,但是变量fat似乎没有正确更新Awk 如何为不同的if语句为变量指定不同的值,awk,Awk,我有一个4列的文本文件。我需要修改文件,使第4列中的第一个1序列保持为1,但第4列中的所有其他值都更改为0 我用多个if语句尝试了下面的awk命令,但是变量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
`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`
`cat sample_data.txt`
72 29 16 0
7330160
7431160
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
8340160
8441160
85 42 16 0.55
86 43 16 0.57
87 44 16 0.41
88 45 16 0.58
89 46 16 1
9047161
9148161
92 49 16 1
9350160.59
9451160.52
95 52 16 0.43
`awk-vfat=1'{if($4wrt)编写代码:
if($4<1 && fat=1)
在gnu awk上试用:
awk -vf=1 '$4==1&&(f||s){f=0;s=1;$4=0;print;next} {s=0}1' sample_data.txt
您的问题是,只需将代码和示例输入/输出缩进4个空格即可正确格式化。编辑器{}
按钮将为您完成此操作。这似乎很好!我想我了解其中的大部分内容,但您能在最后解释一下1吗?这是一个真实的条件,因此它会导致awk执行其默认操作,即打印当前记录。这只是{print}的惯用缩写
。虽然此命令可以回答问题,但提供有关此代码回答问题的原因和/或方式的其他上下文可提高其长期价值。
$ 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
awk -vf=1 '$4==1&&(f||s){f=0;s=1;$4=0;print;next} {s=0}1' sample_data.txt