linux - 模式解码

标签 linux bash shell sed awk

我在以下方面需要一点帮助。我有这种数据文件:

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
    5
    6

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

    3

  • ... 等等。如何以一种我们可以在开始时设置我们希望获得哪种情况的方式进行概括? 根据组中列的值,可能有很多情况。

如果我们考虑这样的事情,我们可以想象一下:第一列表示一条街道上的房屋数量,第二列表示房屋中的房间数量。现在我想找到一个城市中所有可能的街道类型,例如

让我们拿起那些街道,其中有两间房子,房间数不同,第一间房子有 3 个房间,第二间房子有 2 个房间。所以我们得到输出 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

错误:

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 

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

更新

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 更改为:

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

上面最后一行 awk 的意思是,如果房间号 ($3) = 1 并且组 block 中只有一行,则打印组号。

关于linux - 模式解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8765060/

相关文章:

python - 设置python rpm的安装路径

php - 如何从 php 脚本运行 linux 命令来编译 c 程序

bash - 在名称以数字开头的目录中查找编号最高的文件名

bash - 在 OS X 终端修改 Bash 提示前缀

java - 调试 JAR intellij 或命令行

linux - 如何使用 ldapmodify 对 slapd OLC 进行初始设置

linux - eval as if 语句条件

linux - 如何通过 Linux 脚本创建封面样式文本文件?

linux - 如何增量读取行

linux - 使用 su 命令写入/tmp 目录时权限被拒绝