微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux-模式解码

在下面我需要一些帮助.我有这种数据文件

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

0 0    # <--- Group 6

在某些情况下,必须回答:

该示例中有一些组.如果存在一个组,如果它们之间用换行符隔开,那么在这种情况下,我们有6个组.我们必须确定以下内容

获取组的实际编号(普通编号)(例如,计数器从1开始)

>如果第一列= 0且第二列= 0并且下一行为空
因此,根据上述示例,所需的输出

1

6
>如果第一列= 0,第二列可以变化并且下一行为空
因此,根据上述示例,所需的输出

3
> …等.如何以一种我们可以在一开始就设置的方式将其概括化?
根据组中列的值,可能会有很多情况.

如果我们想像这样的话,我们可以想象得到:第一列表示街道上的房屋数量,第二列表示房屋的房间数量.现在我想在城市中找到所有可能的街道,这意味着

让我们拾起那些街道,其中有两间不同房间的房子,第一间有3个房间,第二间有2个房间.所以我们有get输出2,因为此要求满足了文件中的该组

0 0
0 1
0 2
1 0
1 1

重要事项:0 0表示一房一房

纠正:如果只有一间房子,那么它始终只有一间房间!与第1组,第5组和第6组的情况类似.请记住,第二列是房间数,0表示“ 1个房间”,1表示“ 2个房间”,…等等.这只是一个从0开始而不是1的计数器,抱歉,如果让它有些混乱…

解决方法:

我不知道您的预期输出是什么,但是我已经将您的数字模式转换/解码为有意义的组/房屋/房间格式.任何进一步的“查询”都可以在此内容上完成.

见下文:

kent$ cat file
0 0

0 0
0 1
0 2
1 0
1 1

0 0
0 1
0 2

0 0
1 0
2 0
3 0

0 0

0 0

AWK:

kent$ awk 'BEGIN{RS=""} 
        { print "\ngroup "++g; 
        delete a;
        for(i=1;i<=NF;i++) if(i%2) a[$i]++;
        for(x in a) printf "House#: %s , Room(s): %s \n", x, a[x]; }' file

我们得到输出

group 1
House#: 0 , Room(s): 1 

group 2
House#: 0 , Room(s): 3 
House#: 1 , Room(s): 2 

group 3
House#: 0 , Room(s): 3 

group 4
House#: 0 , Room(s): 1 
House#: 1 , Room(s): 1 
House#: 2 , Room(s): 1 
House#: 3 , Room(s): 1 

group 5
House#: 0 , Room(s): 1 

group 6
House#: 0 , Room(s): 1 

请注意,可以更改生成的格式以适合您的“过滤器”或“查询

UPDATE

OP的评论

I need to kNow, the number of the group(s) which have/has for example
1 house with one room. The output would be in the above case: 1, 5 ,6

正如我所说,根据您的查询条件,我们可以为下一步调整awk输出.现在,我将awk uppert更改为:

awk 'BEGIN{RS=""} 
        {print "";  gid=++g; 
        delete a;
        for(i=1;i<=NF;i++) if(i%2) a[$i]++;
        for(x in a) printf "%s %s %s\n", gid,x, a[x]; }' file

这将输出

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 1

格式为groupIdx houseIdx numberOfRooms,并且组之间有空白行.我们将上面的文本保存到名为decoded.txt的文件

因此您的查询可以在以下文本上完成:

kent$ awk 'BEGIN{RS="\n\n"}{if (NF==3 && $3==1)print $1}' decoded.txt
1
5
6

如果房间号($3)= 1并且组块中只有一行,则上面的最后awk行表示打印组号.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐