SED吐出第n和第(n + 1)行

时间:2019-01-11 16:08:58

标签: bash awk sed grep

编辑:作为参考,“ stuff”是一个通用变量,“ KEEP”也是如此。 KEEP在第2行上可能是“嗨,我叫Dave”,在第7行上是“我爱馅饼”。我在此处输入的数字仅供参考,不会显示在数据中。

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

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

5 个答案:

答案 0 :(得分:3)

如果您打算打印第2,3行,然后在这两行之后每四行打印一次,则可以:

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

答案 1 :(得分:1)

您与sed距离很近:

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

答案 2 :(得分:1)

这是用awk书写的惯用方式

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

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

$ awk 'NR%4>1' file

答案 3 :(得分:0)

在一般情况下,您希望保留pp+qp+np+q+np+2np+q+2n的行。 。因此,您可以编写:

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

答案 4 :(得分:0)

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

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

使用一个范围,第一个参数是起始线和模数(在这种情况下,从第2行模数4开始)。第二个参数是人工值跟随范围起点的方式(在本例中为加一)。打印这些行并删除所有其他行。