0

假设我有一个文件如下:

101 abcd <time>
106 efgh <time>
107 ijkl <time>
110 pqrs <time>
105 trsf <time>
101 yrte <time>
109 tyti <time>
110 tyui <time>

我想对从 101 开始到 110 结束的行块做一些操作。当文件中只有一次出现 101 和 110 时,我能够解决它。

sed -ne 's/101/,/110/p' file1 > file2

使用此命令,我可以取出我想要处理的大量行。请帮助我找到能够将第一个块保存在第一个文件中,第二个匹配行保存在第二个文件中的逻辑,依此类推。

我正在 AIX 中编写脚本。

4

2 回答 2

1

你可以这样做:

awk '/^101/ && !i { c++; i=1 } i { print > "file" c } /^110/ { i=0 }' input

c每次一行匹配时,这只是增加一个计数器( ) ^101,但前提是它还没有在正在打印的块中。如果合适,第二个子句打印到名称中带有计数器的输出文件,第三个子句关闭i用于确定当前行是否在要打印的块中的标志 ( )。

另一种选择是简单地做:

awk '/^101/,/^110/{ print > "output" c } /^110/{c++}' c=1 input
于 2013-02-14T21:01:52.017 回答
0

您可以尝试使用 awk,这里有一个简短的单行代码来完成这项工作:

awk '/101/{++i;f=1} f{print $0>"file"i} /110/{f=0}' file

用你的例子测试:

kent$  echo "101 abcd <time>
106 efgh <time>
107 ijkl <time>
110 pqrs <time>
105 trsf <time>
101 yrte <time>
109 tyti <time>
110 tyui <time>"|awk '/101/{++i;f=1} f{print $0>"file"i} /110/{f=0}'

kent$  head *
==> file1 <==
101 abcd <time>
106 efgh <time>
107 ijkl <time>
110 pqrs <time>

==> file2 <==
101 yrte <time>
109 tyti <time>
110 tyui <time>
于 2013-02-14T21:07:28.050 回答