如何转换以下列矩阵:
129
83
83
83
83
83
47
47
45
45
45
45
112
129
83
83
83
83
39
39
47
46
45
112
112
112
.
.
.
(使用awk)进入
:129
83
47
45
129
83
39
47
46
45
112
.
.
.
基本上,如果我有一个连续的字符串实例,我想删除任何副本。但是,对于单个实例“ 112”,我想将其完全删除,除非存在至少两个或更多连续的“ 112”实例,然后我要保留它的副本。谢谢!
答案 0 :(得分:1)
我认为结合uniq / awk来处理特例会更简单。
$ uniq -c file | awk '!/^1 112$/{print $2}'
129
83
47
45
129
83
39
47
46
45
112
答案 1 :(得分:0)
awk '($0==112&&++a[$0]==2)||($0!=112&&a[112]="a"&&p!=$0);{p=$0}' file
129
83
47
45
129
83
39
47
46
45
112
答案 2 :(得分:0)
我会使用@karakfa的uniq + awk解决方案,但以防万一,您希望看到一种在awk中完成所有工作的方法:
$ cat tst.awk
$0 == prev { cnt++; next }
{ prtPrev(); cnt=0; prev=$0 }
END { prtPrev() }
function prtPrev() {
if ( (NR > 1) && !((prev == 112) && (cnt == 0)) ) {
print prev
}
}
$ awk -f tst.awk file
129
83
47
45
129
83
39
47
46
45
112
以及受@JamesJones' answer启发的替代方法:
$ cat tst.awk
$0 != prev { cnt = 0; prev = $0 }
{
++cnt
if ( $0 == 112 ) { hit = (cnt == 2) }
else { hit = (cnt == 1) }
}
hit
$ awk -f tst.awk file
129
83
47
45
129
83
39
47
46
45
112
脱颖而出!
$ awk '$0!=p{c=0;p=$0}{++c;if($0==112)h=(c==2);else h=(c==1)}h' file
129
83
47
45
129
83
39
47
46
45
112