【问题标题】:find match, print first occurrence and continue until the end of the file - awk找到匹配,打印第一次出现并继续直到文件结尾 - awk
【发布时间】:2016-02-25 00:47:16
【问题描述】:

我有一个非常大的文件,我只想从中提取包含我的匹配项的第一行,然后继续这样做直到文件结束。下面的输入和所需输出示例

输入

C,4,2,5,6,8,9,5
C,4,5,4,5,4,43,6
S,4,23,567,2,4,5
S,23,4,7,78,8,9,6
S,3,5,67,8,54,56
S,4,8,9,54,3,4,52
E,2,3,213,5,8,44
E,5,7,9,67,89,33
E,54,526,54,43,53
S,9,8,9,7,9,32,4
S,5,6,4,5,67,87,88
S,4,23,5,8,5,7,3
E,4,6,4,8,9,32,23
E,43,7,1,78,9,8,65

输出

S,4,23,567,2,4,5
S,9,8,9,7,9,32,4

我的行中的匹配项是 S,它通常出现在以 E 或 C 开头的行之后。我正在努力的是告诉 awk 只打印 E 或 C 之后的第一行。另一种方法将打印包含 S 的第一行。有什么想法吗??

【问题讨论】:

    标签: awk


    【解决方案1】:

    这个单线有帮助吗?

    awk '/^S/&&!i{print;i=!i}!/^S/{i=!i}' file
    

    或更多“可读”:

    awk -v p=1 '/^S/&&p{print;p=0}!/^S/{p=1}' file
    

    【讨论】:

    • 这不会检查S 行前面是否有CE 行。我想这个问题有一些生物信息学,遗传学背景。请记住,这样的错误可能会产生严重的后果。 ;)
    • @hek2mgl Another way would be to print the first of the bunch of lines containing S. 我认为这也可以解决 OP 的问题
    • 哦,我明白了,这个问题有点不清楚。最后,当使用 awk 而不是 sed 时,我感觉稍微舒服一些......
    • 从肯特的回答看来,我们很快就会死去……开个玩笑,这根本不是生物!由于某种原因,第一个代码行不适用于我的真实数据集,但第二个代码行完美。确实,这并不是测试 S 行之前是 C 还是 E,但这并不重要。非常感谢肯特,如果你足够勇敢,我会要求一个简短的解释!
    • @eikonal p 变量是一个标志,读取printIt? 默认由1(true) 设置。如果找到S 行和printIt=true,打印它,然后设置printIt=0(false),如果读取了与S 不匹配的行,则printIt 再次设置为1(true)
    【解决方案2】:

    你可以使用sed,像这样:

    sed -rn '/^(E|C)/{:a;n;/^S/!ba;p}' file
    

    【讨论】:

      【解决方案3】:

      这里有一个多行输入文件(例如 u.awk)

      /^[CE]/ {ON=1; next}
      /^S/ {if (ON) print}
      {ON=0}
      

      然后运行:“awk -f u.awk inputdatafile”

      【讨论】:

      • 基本上和你的想法一样,但更精髓:awk '/^[CE]/ {on=1; next} on{print; on=0}'
      • awk不建议使用大写变量名
      【解决方案4】:

      awk 来救援!

      $ awk '/^[CE]/{p=1} /^S/&&p{p=0;print}' file
      
      S,4,23,567,2,4,5
      S,9,8,9,7,9,32,4
      

      【讨论】:

        【解决方案5】:
        $ awk '/^S/{if (!f) print; f=1; next} {print; f=0}' file 
        C,4,2,5,6,8,9,5
        C,4,5,4,5,4,43,6
        S,4,23,567,2,4,5
        E,2,3,213,5,8,44
        E,5,7,9,67,89,33
        E,54,526,54,43,53
        S,9,8,9,7,9,32,4
        E,4,6,4,8,9,32,23
        E,43,7,1,78,9,8,65
        

        【讨论】:

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