Unix 矩阵转换

Unix 矩阵转换,unix,awk,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): 基本上,如果我有一个字符串的任何连续实例,我想删除任何副本。但是,对于'112'的单个实例,我希望将其全部删除,除非至少有2个或更多连续的'112'实例,否则我希望保留其副本。谢谢 我认为使用uniq/awk的组合处理特殊情况会更简单 $ uniq -c file | a

如何转换以下列矩阵:

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):


基本上,如果我有一个字符串的任何连续实例,我想删除任何副本。但是,对于'112'的单个实例,我希望将其全部删除,除非至少有2个或更多连续的'112'实例,否则我希望保留其副本。谢谢

我认为使用uniq/awk的组合处理特殊情况会更简单

$ uniq -c file | awk '!/^1 112$/{print $2}'

129
83
47
45
129
83
39
47
46
45
112

我会使用@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
另一个灵感来自:

向前


没有向下投票,但您尝试了什么吗?矩阵在哪里?如果序列包含
111 112 112
,则期望的结果是什么?应移除第一个112;第三个和第四个的其中一个应该保留,因为它们是连续的,但是第二个应该保留还是删除?我认为它是'删除',但确认将是有用的。嗨乔恩,理想的结果将是111 113 114 112肯定是(这是一个填充)。很好!这很有效:)
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
$ 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
$ 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