编辑:作为参考,“ 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
答案 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)
在一般情况下,您希望保留p
至p+q
和p+n
至p+q+n
和p+2n
至p+q+2n
的行。 。因此,您可以编写:
awk '(NR - p) % n <= q'
答案 4 :(得分:0)
这可能对您有用(GNU sed):
sed '2~4,+1p;d' file
使用一个范围,第一个参数是起始线和模数(在这种情况下,从第2行模数4开始)。第二个参数是人工值跟随范围起点的方式(在本例中为加一)。打印这些行并删除所有其他行。