如何根据其他 2 列的模式添加额外的列
How to add an extra column based on pattern of other 2 columns
我有一个这样的大文件:
567 NA 0 0 NA
568 NA 0 0 NA
569 NA 0 0 NA
570 NA 0 0 NA
571 + 1 1 1
572 + 1 2 1
573 + 1 3 1
966 + 1 396 1
967 NA 0 396 NA
968 NA 0 396 NA
969 NA 0 396 NA
8793 + 1 -3599 2
8794 + 1 -3598 2
3277 - -1 -146 3
3278 - -1 -147 3
3279 - -1 -148 3
8795 + 1 -3597 4
8796 + 1 -3596 4
3280 - -1 -149 5
3281 - -1 -150 5
3282 - -1 -151 5
3283 - -1 -152 6
3284 - -1 -153 6
3285 - -1 -154 6
5692 NA 0 0 NA
3286 - -1 -155 7
我想在一个额外的列中创建一个计数器,最好在末尾(比如 $6),其中对于 $5 if $2=+/-/NA 分别添加 +1/-1 和 0,并保持不变价值,直到 5 美元像那样改变价值。为了更清楚地说明,我想 table 阅读有关 5 美元的价值。基于 2 美元,我的计数器必须将其值更改为 +1(+)、-1(-)和 0(N/A)。最后,我需要新计数器不断打印计数器值,直到 $5 的值发生变化:
NA NA 0
NA NA 0
NA NA 0
NA NA 0
+ 1 1
+ 1 1
+ 1 1
+ 1 1
NA NA 1
NA NA 1
NA NA 1
+ 2 2
+ 2 2
- 3 1
- 3 1
- 3 1
+ 4 2
+ 4 2
- 5 1
- 5 1
- 5 1
- 6 0
- 6 0
- 6 0
NA 6 0
- 7 -1
我输入了这个:
awk 'BEGIN {v=0; p=0} {if (=="-") {v=v-1 ;p=v} if (=="NA") {p=n; v=;} else {v=+1;p=n}; =v;=p; print}' MyFIle
但它几乎给出了与 $5 相同的值。
$ awk 'BEGIN {a["+"]=1;a["-"]=-1;a["NA"]=0}
p!= {p=; c+=a[]}
{print ,,c}' file | column -t
NA NA 0
NA NA 0
NA NA 0
NA NA 0
+ 1 1
+ 1 1
+ 1 1
+ 1 1
NA NA 1
NA NA 1
NA NA 1
+ 2 2
+ 2 2
- 3 1
- 3 1
- 3 1
+ 4 2
+ 4 2
- 5 1
- 5 1
- 5 1
- 6 0
- 6 0
- 6 0
NA NA 0
- 7 -1
或者,高尔夫版本
$ awk 'p!={c+=!="NA"?"1":0} {print ,p=,c}' file | column -t
我有一个这样的大文件:
567 NA 0 0 NA
568 NA 0 0 NA
569 NA 0 0 NA
570 NA 0 0 NA
571 + 1 1 1
572 + 1 2 1
573 + 1 3 1
966 + 1 396 1
967 NA 0 396 NA
968 NA 0 396 NA
969 NA 0 396 NA
8793 + 1 -3599 2
8794 + 1 -3598 2
3277 - -1 -146 3
3278 - -1 -147 3
3279 - -1 -148 3
8795 + 1 -3597 4
8796 + 1 -3596 4
3280 - -1 -149 5
3281 - -1 -150 5
3282 - -1 -151 5
3283 - -1 -152 6
3284 - -1 -153 6
3285 - -1 -154 6
5692 NA 0 0 NA
3286 - -1 -155 7
我想在一个额外的列中创建一个计数器,最好在末尾(比如 $6),其中对于 $5 if $2=+/-/NA 分别添加 +1/-1 和 0,并保持不变价值,直到 5 美元像那样改变价值。为了更清楚地说明,我想 table 阅读有关 5 美元的价值。基于 2 美元,我的计数器必须将其值更改为 +1(+)、-1(-)和 0(N/A)。最后,我需要新计数器不断打印计数器值,直到 $5 的值发生变化:
NA NA 0
NA NA 0
NA NA 0
NA NA 0
+ 1 1
+ 1 1
+ 1 1
+ 1 1
NA NA 1
NA NA 1
NA NA 1
+ 2 2
+ 2 2
- 3 1
- 3 1
- 3 1
+ 4 2
+ 4 2
- 5 1
- 5 1
- 5 1
- 6 0
- 6 0
- 6 0
NA 6 0
- 7 -1
我输入了这个:
awk 'BEGIN {v=0; p=0} {if (=="-") {v=v-1 ;p=v} if (=="NA") {p=n; v=;} else {v=+1;p=n}; =v;=p; print}' MyFIle
但它几乎给出了与 $5 相同的值。
$ awk 'BEGIN {a["+"]=1;a["-"]=-1;a["NA"]=0}
p!= {p=; c+=a[]}
{print ,,c}' file | column -t
NA NA 0
NA NA 0
NA NA 0
NA NA 0
+ 1 1
+ 1 1
+ 1 1
+ 1 1
NA NA 1
NA NA 1
NA NA 1
+ 2 2
+ 2 2
- 3 1
- 3 1
- 3 1
+ 4 2
+ 4 2
- 5 1
- 5 1
- 5 1
- 6 0
- 6 0
- 6 0
NA NA 0
- 7 -1
或者,高尔夫版本
$ awk 'p!={c+=!="NA"?"1":0} {print ,p=,c}' file | column -t