【问题标题】:SED to spit out nth and (n+1)th linesSED 吐出第 n 行和第 (n+1) 行
【发布时间】:2019-01-12 09:28:36
【问题描述】:

编辑:作为参考,“stuff”是一个通用变量,“KEEP”也是如此。 KEEP 可以是第 2 行的“嗨,我叫 Dave”和第 7 行的“I love pie”。我在此处输入的数字仅用于说明,不会出现在数据中。

我有一个需要解析的文件,每 4 行保留一次,从第 3 行开始。换句话说,它看起来像这样:

1 stuff
2 stuff
3 KEEP
4 
5 stuff
6 stuff
7 KEEP
8 stuff etc...

太好了,sed 轻松解决了这个问题:

sed -n -e 3~4p myfile

给我

3 KEEP
7 KEEP
11 KEEP

现在我有了不同的文件格式和不同的模式:

1 stuff
2 KEEP
3 KEEP
4
5 stuff
6 KEEP
7 KEEP etc...

我仍然想要

的输出
2 KEEP
3 KEEP
6 KEEP
7 KEEP
10 KEEP
11 KEEP

这就是问题所在 - 这是 sed 的多模式“模式”。它是“每 4 行,吐出 2 行,但从第 2 行开始”。

我是否需要在我的 sed 中使用某种 DO/FOR 循环,还是需要其他命令,例如 awk 或 grep?到目前为止,我已经尝试过以下格式:

sed -n -e '3~4p;4~4p' myfile

awk 'NR % 3 == 0 || NR % 4 ==0' myfile

sed -n -e '3~1p;4~4p' myfile

awk 'NR % 1 == 0 || NR % 4 ==0' myfile

来源:https://superuser.com/questions/396536/how-to-keep-only-every-nth-line-of-a-file

【问题讨论】:

  • 能否请您在代码标签中提及明确的预期输出并告诉我们。
  • @RavinderSingh13 完成 - 它位于“新模式”之后的中间
  • 你能检查一下粘贴的命令吗?
  • 简单来说,我们如何知道要打印哪一行?由于您不是在搜索特定的字符串等。请务必提及。
  • sed 用于在单独的行上执行s/old/new就是这样。如果您需要做任何其他事情,那么甚至不要考虑使用 sed,只需使用 awk,因为结果将是更清晰、更简单、更高效、更便携、更健壮、更易于维护、更易于增强等的某种组合。

标签: bash awk sed grep


【解决方案1】:

如果您的意图是打印第 2,3 行,那么在这两行之后每隔四行打印一次,您可以这样做:

$ seq 20 | awk 'BEGIN{e[2];e[3]} (NR%4) in e'
2
3
6
7
10
11
14
15
18
19

【讨论】:

  • 或等价于awk '(NR%4) ~ /[23]/'
  • 或等价于awk 'index("23",NR%4)'。 @dawg 方法的许多选项是最容易扩展的,因为即使您想搜索多位数字(例如,每 968 行中打印第 43 行和第 127 行),它也可以按原样工作。
【解决方案2】:

你和你的sed非常接近:

$ printf '%s\n' {1..12} | sed -n '2~4p;3~4p'
2
3
6
7
10
11

【讨论】:

  • 我猜人们正在查看行号并键入它,但那是为了说明并且在数据中不存在(我认为它会澄清 RavinderSingh13 的事情),但是 sed 命令这就是我所需要的。 sed -n '2~3p;3~4p 非常适合线条模式,并且可以扩展到整个文件。
  • 行号显示您将使用我们的命令打印的行号。我们认为这不是您的真实数据。
【解决方案3】:

这是awk的惯用写法

$ awk 'NR%4==2 || NR%4==3' file

但是,这种特殊情况可以缩短为

$ awk 'NR%4>1' file

【讨论】:

    【解决方案4】:

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

    sed '2~4,+1p;d' file
    

    使用范围,第一个参数是起始行和模数(在本例中从第 2 行模数 4)。第二个参数是范围开始之后的 man 行(在本例中是加一)。打印这些行并删除所有其他行。

    【讨论】:

      【解决方案5】:

      在一般情况下,您希望将行 pp+qp+np+q+np+2np+q+2n ......所以你可以写:

      awk '(NR - p) % n <= q'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        • 1970-01-01
        • 2011-03-30
        • 2014-02-17
        • 1970-01-01
        相关资源
        最近更新 更多