【问题标题】:awk print matching line and line before the matchedawk 打印匹配行和匹配前的行
【发布时间】:2011-06-20 22:54:21
【问题描述】:

以下是我尝试使用 awk 做的事情。获取匹配正则表达式的行和匹配之前的行并打印。我可以得到与正则表达式匹配的行,但不是之前的行:

awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}' 

【问题讨论】:

  • 假设第 3 行和第 4 行匹配正则表达式。你想让 2,3,4 出现吗?

标签: regex awk


【解决方案1】:

我创建了以下 awk 脚本。打印匹配的行以及前 2 行。您可以从这个想法中使其更加灵活。

search.awk

{
    a[0]=$0;
    for(i=0;i<2;i++)
    {
       getline;
       if(i==0){
            a[1]=$0;
       }
       if(i==1){
            if($0 ~ /message received/){
                print a[0];     
                print a[1];
                print $0;
            }
       }
    }
}

用法:

awk '{print $0}' LogFile.log | awk -f search.awk

【讨论】:

    【解决方案2】:

    可能有点跑题了,但我使用 belisarius 的答案创建了我自己的上述解决方案的变体,它搜索 Nth 条目,并返回该条目和上一行。

    awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file
    

    【讨论】:

      【解决方案3】:

      使用更直接的模式搜索

      gawk '{if (/^abc$/) {print x; print $0};x=$0}' file1 &gt; file2

      【讨论】:

        【解决方案4】:
        /abc/{if(a!="")print a;print;a="";next}
        {a=$0}
        

        【讨论】:

        • 您的脚本将无法正确处理“bcd\nabc\nabcdef”之类的情况
        • 已更正以说明这一点。
        【解决方案5】:

        为什么不使用grep -EB1 '^CGCGGCTGCTGG'

        awk 做同样的事情很啰嗦,见 Marco 的回答。

        【讨论】:

        • 感谢 Marco 和 Solmojo..grep 也可以,只是想在 awk 中做。
        • 作为一个学习练习,这是一件好事,但是,grep 也会运行得更快,并且在生物识别方面这可能是一个有用的功能。
        • 如果你只需要这样做,当然可以。但如果您需要将其作为较长 awk 脚本的一部分,那么您需要一种更灵活的方法。
        【解决方案6】:

        在这种情况下,您可以使用 grep 轻松解决它:

        grep -B1 foo file
        

        但是,如果您需要使用 awk:

        awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file
        

        【讨论】:

        • awk '{if ($0~/>/) head=$0;getline} {if ($0~/^CGCGGCTGCTGG/) 打印头"\n"$0}' 怎么样?对吗??
        • @Sudeep:你可以通过测试来告诉自己它是否正确......但它比marco的建议更长更难理解,所以为什么要麻烦?
        • 谢谢 Jeromi,是的,我可以测试...我是,但 getline 有点混乱,这就是为什么我发布看到有人看到命令并且可以升旗 :)
        • @Sudeep:我的观点完全正确。这很令人困惑,所以如果没有它有一个非常好的方法,请不要费心让自己感到困惑。
        • 并非所有 grep(1) 都有“-B”选项。这是非标准的。
        猜你喜欢
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        相关资源
        最近更新 更多