如何选择在文件中多次出现的相同行序列?

时间:2013-02-14 20:43:53

标签: linux unix sed aix

假设我有一个如下文件:

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中编写脚本。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

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

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

另一个选择就是:

awk '/^101/,/^110/{ print > "output" c } /^110/{c++}' c=1 input

答案 1 :(得分: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>