首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配模式后分割多行

匹配模式后分割多行
EN

Stack Overflow用户
提问于 2022-03-04 16:30:34
回答 2查看 160关注 0票数 2

不好意思,我问了一个新手问题,但是我有一个文件,它看起来像这样,想要在某个字符串(即/aggr )之后捕获一行。

代码语言:javascript
复制
/aggr0_usts_nz_3001/plex0/rg0:
9g.10.0            0   4.08    0.00   ....     .   4.08   1.00    41   0.00   ....     .
1a.10.1            0   4.08    0.00   ....     .   4.08   1.00    10   0.00   ....     .
9g.10.4            0   4.08    0.00   ....     .   4.08   1.00    49   0.00   ....     .
1a.10.1            0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
9g.10.4            0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
/aggr1_usts_nz_3001/plex0/rg0:
1e.00.0            0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
9o.01.44           0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
1e.00.1            4 994.04  994.04   1.44   119   0.00   ....     .   0.00   ....     .
9o.01.41           4 981.91  981.91   1.41   141   0.00   ....     .   0.00   ....     .
1e.00.4            4 811.19  811.19   1.14   149   0.00   ....     .   0.00   ....     .
9o.01.14           4 809.99  809.99   1.14   119   0.00   ....     .   0.00   ....     .
1e.00.1            4 980.86  980.86   1.19   144   0.00   ....     .   0.00   ....     .
9o.01.11           4 998.89  998.89   1.11   140   0.00   ....     .   0.00   ....     .
/aggr1_usts_nz_3001/plex0/rg1:
9a.10.14           0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
9e.40.14           0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
1g.11.14           4 999.10  999.10   1.16   110   0.00   ....     .   0.00   ....     .
1o.41.14           4 996.90  996.90   1.44   118   0.00   ....     .   0.00   ....     .
9a.10.11           4 911.11  911.11   1.44   116   0.00   ....     .   0.00   ....     .
9e.40.11           4 919.48  919.48   1.11   141   0.00   ....     .   0.00   ....     .
1g.11.11           4 900.44  900.44   1.16   146   0.00   ....     .   0.00   ....     .
1o.41.11           1 694.19  694.19   1.19   109   0.00   ....     .   0.00   ....     .
9a.10.14           4 941.44  941.44   1.61   111   0.00   ....     .   0.00   ....     .

例如,我想在例如/aggr0之后取出一行,并将其重定向到一个文件中。所以样本是,file1会有这样的信息

代码语言:javascript
复制
/aggr0_usts_nz_3001/plex0/rg0:
9g.10.0            0   4.08    0.00   ....     .   4.08   1.00    41   0.00   ....     .
1a.10.1            0   4.08    0.00   ....     .   4.08   1.00    10   0.00   ....     .
9g.10.4            0   4.08    0.00   ....     .   4.08   1.00    49   0.00   ....     .
1a.10.1            0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
9g.10.4            0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .

然后file2将是这个信息,等等。

代码语言:javascript
复制
/aggr1_usts_nz_3001/plex0/rg0:
1e.00.0            0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
9o.01.44           0   0.00    0.00   ....     .   0.00   ....     .   0.00   ....     .
1e.00.1            4 994.04  994.04   1.44   119   0.00   ....     .   0.00   ....     .
9o.01.41           4 981.91  981.91   1.41   141   0.00   ....     .   0.00   ....     .
1e.00.4            4 811.19  811.19   1.14   149   0.00   ....     .   0.00   ....     .
9o.01.14           4 809.99  809.99   1.14   119   0.00   ....     .   0.00   ....     .
1e.00.1            4 980.86  980.86   1.19   144   0.00   ....     .   0.00   ....     .
9o.01.11           4 998.89  998.89   1.11   140   0.00   ....     .   0.00   ....     .

这就像隔离文件上的信息一样。

如果下面有这个命令,但是因为aggr后面的行不一样,它将只显示定义的内容(即7)。

代码语言:javascript
复制
for i in `cat sample.txt`; do
    echo $i | grep aggr* -A 7
done

但它只是展示了我的问候。

这里的命令在匹配模式之后打印2行,但是我想要的是将它重定向到一个文件。

代码语言:javascript
复制
awk '/aggr/{x=NR+2}(NR<=x){print}' sample.txt

你知道我该怎么做吗。

EN

Stack Overflow用户

发布于 2022-03-05 01:17:36

这可能对您有用(GNU csplit):

代码语言:javascript
复制
csplit -n1 -ffile file '/^\/aggr/' '{*}'

这将从示例file0 file1 file2 file3生成4个文件,其中file0为空。如果您不介意从零开始的数字,请使用:

代码语言:javascript
复制
csplit -zn1 -ffile file '/^\/aggr/' '{*}'

这将删除第一个空文件。

对于使用bash的sed解决方案:

代码语言:javascript
复制
sed -En '/^\/aggr/!b;x;s/^/1/;x;:a;H;$!{n;/^\/aggr/!ba};x
        s/^(\S+)\n(.*)/echo "\2" > file\1;echo $((\1+1))/e;x;$!ba' file

本质上--这将在保存空间中收集文件的拆分,并在遇到下一个拆分或文件末尾时将其写入。

当遇到第一个拆分作为保持空间的第一行时,将文件号预先准备好,并且在写入拆分后,还使用标准bash算法增加文件号,并替换保持空间的内容。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71354361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档