【问题标题】:Remove every x lines from text input从文本输入中删除每 x 行
【发布时间】:2013-10-29 13:28:06
【问题描述】:

我正在寻找一些带有几行的日志文件,然后从匹配项中丢弃垃圾行。更糟糕的是,愚蠢的代码两次输出相同的异常,所以我想每隔一个 grep 匹配就丢弃。我不知道是否有一种好方法可以跳过所有其他 grep 匹配,同时还包括周围的行,所以我很高兴一次性完成。

假设我们从 grep 得到以下结果:

InterestingContext1
lkjsdf
MatchExceptionText1
--
kjslkj
lskjlk
MatchExceptionText2
--
InterestingContext3
lkjsdf
MatchExceptionText3
--
kjslkj
lskjlk
MatchExceptionText4
--

显然,grep 匹配是“MatchExceptionText”(当然是简化的)。因此,我想将其通过管道传输到可以删除第 2、5、6、7、8 行的地方,然后重复该模式,因此结果如下所示:

InterestingContext1
MatchExceptionText1
--
InterestingContext3
MatchExceptionText3
--

对我来说,重复是事情变得棘手的地方。我知道 sed 可以删除某些行号,但我不知道如何将它们分组为 8 行组并在所有组中重复该剪切。

有什么想法吗?感谢您的帮助。

【问题讨论】:

    标签: unix sed grep


    【解决方案1】:

    awk 可以进行模数运算,因此以读取 mod 8 的行数为条件进行打印应该允许您重复该模式。

    awk 'NR%8 ~ /[134]/' file
    

    【讨论】:

    • 所以如果你的偏移是正确的,awk 'NR%8 ~ /[134]/' file。在这里使用正则表达式有点作弊。请注意,[134] 是一个恰好在这里工作的字符类,因为所有可能的模值都是单个数字。
    • 我将其读作 mod 8,因为该模式每 8 行重复一次。 Cameron 从 1 开始计数,但在应用模数后,我们需要从 0 开始计数。
    • 你是对的,事实上我已经修改了我的评论。抱歉评论太快了。
    【解决方案2】:

    Sed 可以做到:

    sed -n 'N;s/\n.*//;N;N;p;N;N;N;N' filename
    

    编辑:

    想一想,这个稍微好一点:

    sed -n 'p;n;n;N;p;n;n;n;n' filename
    

    【讨论】:

      【解决方案3】:

      使用 GNU awk,您可以在适当的记录分隔符处拆分输入并打印所需的输出,例如:

      awk 'NR%2 {print $1, $3}' RS='--\n' ORS='\n--\n' OFS='\n' infile
      

      输出:

      InterestingContext1
      MatchExceptionText1
      --
      InterestingContext3
      MatchExceptionText3
      --
      

      【讨论】:

        【解决方案4】:

        这可能对你有用(GNU sed):

        sed -n 'p;n;n;p;n;p;n;n;n;n' file
        

        【讨论】:

          【解决方案5】:
          sed -n "s/^.*\n//;x;s/^/²/
          
          /^²\{1\}$/ b print
          /^²\{3\}$/ b print
          /^²\{4\}$/ b print
          /^²\{7\}$/ b print
          /^²\{8\}$/ b print
          
          b cycle
          
          : print
          x;
          # your treatment begin
          p
          # your treatment stop
          x
          
          : cycle
          /^²\{8\}$/ s/.*//
          x
          " YourFile
          

          主要用于参考相对行号的“case of”,只需更改/^²\{YourLineNumber\}$/中的数字即可获取其他相对行位置。

          不要忘记重置循环的最后一个行号

          • 第一部分取线并准备相关的线计数器
          • 第二部分是案例
          • 第三部分是处理(这里是打印)
          • 最后一部分是循环计数器的重置(如果需要)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-23
            • 1970-01-01
            相关资源
            最近更新 更多