假设我有一个如下文件:
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中编写脚本。
答案 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>