用sed删除行块

时间:2014-04-29 06:54:17

标签: sed

我正在尝试浏览一个文件,并在每个连续的4行组中保留一组连续的40行。

所以在整个文件中,我会保留行1-441-4481-84等。
我尝试使用sed,但我真的只能删除特定的行,而不是这样的模式。

非常感谢......

4 个答案:

答案 0 :(得分:4)

awk应该:

awk 'NR%40==1 || NR%40==2 || NR%40==3 || NR%40==4' file

循环版本:

awk '{for (i=1;i<5;i++) if (NR%40==i) print $0}' file

发现这应该在我测试各种解决方案后起作用:

awk 'NR%40~/^[1-4]$/' file

测试

seq 1 100 > file

awk 'NR%40~/^[1-4]$/' file
1
2
3
4
41
42
43
44
81
82
83
84

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -n '1~40,+3p' file

从第1行开始使用40行步,并将其放在4行以上。

答案 2 :(得分:1)

使用awk可能会更好。这不是最简洁的解决方案,但应该得到你想要的。变量NR表示行号。

 awk '(NR - 1) % 40 ==0 || (NR - 2) % 40 ==0 || (NR - 3) % 40 ==0 || (NR - 4) % 40 ==0 ' Input.txt

我测试了这个:

 seq 1 50 > /tmp/Input.txt
 awk '(NR - 1) % 40 ==0 || (NR - 2) % 40 ==0 || (NR - 3) % 40 ==0 || (NR - 4) % 40 ==0 ' /tmp/Input.txt

如果要修改原始文件,请将其输出到临时文件并将其移回。

awk '(NR - 1) % 40 ==0 || (NR - 2) % 40 ==0 || (NR - 3) % 40 ==0 || (NR - 4) % 40 ==0 ' Input.txt > /tmp/TempOutput
mv /tmp/TempOutput Input.txt

答案 3 :(得分:0)

简单但做了所要求的事情(根据seq测试向@Jotne求助)

sed -n 'N;N;N;p;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N' YourFile

只是为了好玩

sed -n '
x    
s/^$/ppppfffffffffffffffffffffffffffffffffff/
s/^p//
t keep
s/^f//
x
b
:keep
x
p' YourFile

仅使用dpN还有另一种更传统的方式,但根本不好笑:-)。 我使用了一种p rint和f orget行(ppppfffffffffffffffffffffffffffffffffff)保留在缓冲区中的模板计数器