【问题标题】:How can I select same sequence of lines which is present multiple times in a file?如何选择文件中多次出现的相同行序列?
【发布时间】:2013-01-30 18:40:32
【问题描述】:

假设我有一个文件如下:

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

【问题讨论】:

  • 我猜s 不应该在那个sed 脚本中?
  • 嗨列夫,是的,s 不应该在那里..

标签: linux unix sed aix


【解决方案1】:

你可以这样做:

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

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

另一种选择是简单地做:

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

【讨论】:

    【解决方案2】:

    您可以尝试使用 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多