矩阵转换

时间:2018-12-03 19:51:52

标签: unix awk

如何转换以下列矩阵:

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”实例,然后我要保留它的副本。谢谢!

3 个答案:

答案 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