- 论坛徽章:
- 0
|
本帖最后由 nina0622 于 2018-06-22 23:25 编辑
回复 10# wh7211
谢谢大神的耐心解答,我好好理顺了一遍,但是过程中如果稍加修改代码就出现了一点小错误,我觉得代码应该没错,可是想不明白为什么就是不行
原始的代码:
- awk '!a[$1]++{if(a>=3){print d};b=$1;c=d=""}{c++;d=d?c<=3?d"\n"$0:d:$0}END{if(a>=3){print d}}' file
复制代码
1. 建立数组a,并以第一列为下标。
第一行:!a[$1]++为真,此时a[$1]=1;if(a>=3) 其中b未赋值,为假,不打印d;并对b进行赋值,b=$1, c=d=""; 接着:c++, 此时c=1, if(d)为假,所以执行{d=$0},对d进行赋值;
第二行:!a[$1]++为假,忽略第一个action; c++,此时c=2, if(d)为真,if(c<=3)为真,执行 d=d"\n"$0,此时d是两行的内容;{d=$0}不执行;
第三行:和第二行类似
若出现第一列相同的第四行,则c++, 此时c=4, if(d)为真,但是if(c<=3)为假,因此d不变,最后执行if(a>=3), 此时b=4,满足条件,打印前三行
2. 疑问:
a: 代码里的b为什么不能直接用$1代替,比如写成if(a[$1]>=3){print d}
b: awk '!a[$1]++{if(a>=3){print d};b=$1;c=d=""}{c++;if(d){if(c<=3){d=d"\n"$0}}{d=$0}}END{if(a>=3){print d}}' file
直接替换成上面的代码,理解起来是对的,但是碰到执行又错了
|
|