我正在尝试浏览一个文件,并在每个连续的4
行组中保留一组连续的40
行。
所以在整个文件中,我会保留行1-4
,41-44
,81-84
等。
我尝试使用sed
,但我真的只能删除特定的行,而不是这样的模式。
非常感谢......
答案 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
仅使用d
,p
和N
还有另一种更传统的方式,但根本不好笑:-)。
我使用了一种p
rint和f
orget行(ppppfffffffffffffffffffffffffffffffffff
)保留在缓冲区中的模板计数器