【问题标题】:Pattern decoding II [duplicate]模式解码 II [重复]
【发布时间】:2023-04-01 17:32:02
【问题描述】:

可能重复:
Pattern decoding

我对上一篇关于模式解码的帖子有一些新问题:

我有几乎相同的数据文件,但是有双空(空白)行,在解码时必须考虑到这一点。 因此,双空线表示有一条街道/灌浆(有关定义,请参见上一篇文章:Pattern decoding),其中有零 (0) 个房子,但我们也必须计算这种模式。 (是的,您可能会认为,这是绝对错误的说法,因为没有至少一栋房子的街道,但这只是一个比喻,所以请接受它。)

这是新的数据文件,带有双线:

0 0    # <--- Group 1 -- 1 house (0) and 1 room (0)

0 0    # <--- Group 2 -- 2 houses (0;1) and 3,2 rooms (0,1,2;0,1)
0 1
0 2    
1 0    # <--- house 2 in Group 2, with the first room (0)
1 1    # <--- house 2 in Group 2, with the second room (1)

0 0    # <--- Group 3
0 1    # <--- house 1 in Group 3, with the second room (1)
0 2

0 0    # <--- Group 4
1 0    # <--- house 2 in Group 4, with one room only (0)
2 0
3 0    # <--- house 4 in Group 4, with one room only (0)

0 0    # <--- Group 5
       # <--- Group 6 << ---- THIS IS THE NEW GROUP

0 0    # <--- Group 7
       # <--- Group 8 << ---- THIS IS THE NEW GROUP

0 0    # <--- Group 9

0 0    # <--- Group 10 

我需要像以前一样将其转换为一种优雅的方式,但在这种情况下,我们也必须考虑这些新组,并按照 Kent 例如:roupIdx houseIdx numberOfRooms,其中 houseIdx 等于零 houseIdx = 0numberOfRooms 也等于零 numberOfRooms = 0。所以,我需要得到这种输出,例如:

1 0 1

2 0 3
2 1 2

3 0 3

4 0 1
4 1 1
4 2 1
4 3 1

5 0 1

6 0 0

7 0 1

8 0 0

9 0 1

10 0 1

我们可以这样调之前的代码吗?

更新:新的第二个空行表示一个新组。如果在空行之后还有一个空的新行,如本例

0 0    # <--- Group 5
       # <--- Group 6 << ---- THIS IS THE NEW GROUP

0 0    # <--- Group 7
       # <--- Group 8 << ---- THIS IS THE NEW GROUP

我们只是将新的空行(2 个空行中的第二个)视为一个新组,并将它们表示为group_index 0 0。请参阅上面的所需输出!

【问题讨论】:

  • 给一个人一条鱼,他第二天会回来吃第二条吗?第一个问题的答案为您的问题提供了非常好的 awk 代码。
  • 与以前的问题不同...是的,我知道上一篇文章中有一个非常好的答案,但不适用于当前的问题...
  • 我推荐阅读tinyurl.com/so-hints,并特别注意“留下好印象”。

标签: linux bash shell sed awk


【解决方案1】:

试试:

$ cat houses.awk
BEGIN{max=1;group=1}
NF==0{
   empty++
   if (empty==1) group++
   next
}
{ max = ($1 > max) ? $1 : max
   if (empty<=1){
        a[group,$1]++ 
   } else {
        a[group,$1]=-1
   }
  empty=0
}
END{for (i=1;i<=group;i++){
        for (j=0;j<=max;j++){
            if (a[i,j]>=1)
                print i , j , a[i,j]
            if (a[i,j]==-1)
                print i, j, 0
        }
        printf "\n"
    }
}

命令:

awk -f houses.awk houses

输出:

1 0 1

2 0 3
2 1 2

3 0 3

4 0 1
4 1 1
4 2 1
4 3 1

5 0 1

6 0 0

7 0 0

8 0 1

【讨论】:

  • 这不太好,我没有准确地得到这个结果:我得到了 7 0 1, 9 0 1, 10 0 1 ... 不知何故
  • 我们应该得到 6 0 07 0 0 而不是你的结果
  • 非常感谢。只是一个小问题/问题:确实,前面的代码在某种意义上很好,如果有双“\n\n”换行符,我需要将组计数器增加一个,所以6 0 07 0 1,@ 987654328@、9 0 110 0 1 输出正确。能不能按照这个来更新一下代码,因为我不小心把之前的删掉了……
  • 查看帖子中的UPDATE...
  • 请收拾你问题中的烂摊子,并清楚地描述你想要什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2022-10-14
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多