根据条件添加新列

时间:2018-08-17 12:25:44

标签: awk

这是之前问过的同样的问题,但是为了更好的理解,我更改了文本。

在第2列的开头,同一块(2000)有3行,在下一个块(2336)中有9行,而对于块(2524)有3行。

在块(2336)中,竞争超过3行。第1列的值增加是每2个,但是当它大于36时。然后,第3列的值从3601到33607(较低的值)= S3,第3列的值从34033到34041(较高的值)= S2

在原始文件中,我有数千行。

您可以认为输入文件包含3个部分:

**PART1)** blocks of 3 lines ( 2000 -2005 ) value in colunm 3 = S2
**PART2)** blocks with more than 3 lines ( 2336 -2339 ) need to consider column 1 for the value in column 3 ( lower values = S3) ( higher values = S2) 
**PART3)** last blocks with 3 lines value in colunm 3 = S3.. 

当块具有多于3行以定义第3列中的值时,检查第1列中的值是很重要的。

输入文件

30001 2000
30003 2000
30005 2000
30007 2005
30009 2005
30011 2005
33601 2336
33603 2336
33605 2336
33607 2336
34033 2336
34035 2336
34037 2336
34039 2336
34041 2336
33609 2339
33611 2339
33613 2339
34043 2339
34045 2339
34047 2339
34049 2339
35857 2524
35859 2524
35861 2524
35855 2527
35857 2527
35869 2527

输出文件

30001 2000 S2
30003 2000 S2
30005 2000 S2
30007 2005 S2
30009 2005 S2
30011 2005 S2
33601 2336 S3
33603 2336 S3
33605 2336 S3
33607 2336 S3
34033 2336 S2
34035 2336 S2
34037 2336 S2
34039 2336 S2
34041 2336 S2
33609 2339 S3
33611 2339 S3
33613 2339 S3
34043 2339 S2
34045 2339 S2
34047 2339 S2
34049 2339 S2
35857 2524 S3
35859 2524 S3
35861 2524 S3
35855 2527 S3
35857 2527 S3
35869 2527 S3

我尝试过

awk '$3<0{c=3} {$3=(c-->0)?"S3":"S2"}1' tmp1 | tac | awk 'NR<=36 {$NF="S3"}1' | tac | awk '{print $2$1,$3}'

感谢您的支持。

1 个答案:

答案 0 :(得分:2)

这是双重扫描解决方案...

$ awk 'NR==FNR {count[$2]++; n=NR; next} 
               {if(big && !jump) jump=$1-prev>2; 
                if($2!=block) {big=(count[$2]>3);jump=0}; 
                f=(big && !jump || n-FNR<3)?"S3 :"S2"; 
                print $0,f} {prev=$1;block=$2}' file{,}

30001 2000 S2
30003 2000 S2
30005 2000 S2
30007 2005 S2
30009 2005 S2
30011 2005 S2
33601 2336 S3
33603 2336 S3
33605 2336 S3
33607 2336 S3
34033 2336 S2
34035 2336 S2
34037 2336 S2
34039 2336 S2
34041 2336 S2
33609 2339 S3
33611 2339 S3
33613 2339 S3
34043 2339 S2
34045 2339 S2
34047 2339 S2
34049 2339 S2
35857 2524 S2
35859 2524 S2
35861 2524 S2
35855 2527 S3
35857 2527 S3
35869 2527 S3

现在倒数第二个块标记为S3而不是S2。逻辑是什么? PART3)处理多少个最后块?

我发布此信息是因为它与预期的输出不匹配,从而激发了其他愿意帮助的人。

相关问题