使用sed删除行块

使用sed删除行块,sed,Sed,我试图遍历一个文件,并在每个连续的40行组中保留一个连续的4行组 所以在整个文件中,我将保留第1-4、41-44、81-84行,等等。 我尝试使用sed,但实际上我只能删除特定的行,而不能执行这样的模式 非常感谢……您可能会更喜欢awk。这不是最简洁的解决方案,但应该能满足您的需求。变量NR表示行号 awk '(NR - 1) % 40 ==0 || (NR - 2) % 40 ==0 || (NR - 3) % 40 ==0 || (NR - 4) % 40 ==0 ' Input.txt

我试图遍历一个文件,并在每个连续的40行组中保留一个连续的4行组

所以在整个文件中,我将保留第1-4、41-44、81-84行,等等。 我尝试使用sed,但实际上我只能删除特定的行,而不能执行这样的模式


非常感谢……

您可能会更喜欢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

有了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
此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应具备以下功能:

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
试验


简单,但根据seq测试,按要求thks对@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,但一点也不好笑:-。
我使用一种模板计数器,打印并忘记PPPPFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

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,但一点也不好笑:-。
我使用一种模板计数器,打印并忘记PPPPFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

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

从第1行开始使用40行步骤,并将其范围扩大到4行。

这可能适用于GNU-sed:

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

从第1行开始使用40行步骤,并将其范围扩大到4行。

merline2011:谢谢!但出于某种原因,它似乎对我不起作用。我有一个文件,每行上都有数字1到124,当我在末尾用我的文件名运行该命令,然后对结果进行cat时,该文件似乎没有改变…@user2808302,awk没有进行就地更改。如果您希望在新文件中包含内容,则需要将输出重定向到另一个文件。@merlin2011 GNU awk 4.1或更高版本可以进行就地更改。这是手册的一部分。merline2011:谢谢!但出于某种原因,它似乎对我不起作用。我有一个文件,每行上都有数字1到124,当我在末尾用我的文件名运行该命令,然后对结果进行cat时,该文件似乎没有改变…@user2808302,awk没有进行就地更改。如果您希望在新文件中包含内容,则需要将输出重定向到另一个文件。@merlin2011 GNU awk 4.1或更高版本可以进行就地更改。这是手册的一部分。@merlin2011否,它打印1,2,3,4,41,42,43等,如OPrequest@merlin2011找到了一个更短的testing@Jotne,非常好我希望下次我问你关于如何缩短意大利面条awk代码的问题时,你能回答。@merlin2011谢谢。有时,我对实际工作的简短代码印象深刻。我做了很多测试来让它工作,它太好了,我把它添加到我的个人awk列表中。我确实试过像这样的NR%40==1 | 2 NR%40==1 | 2 NR%40==1 | 2/NR%40=/[1-2]/NR%40~1 | 2 NR%40~/1 | 2/NR%40~/[1-2]/不起作用,然后尽管关于限制使用“^和$”的字段,最终使它起作用了NR%40~/^[1-2]$/现在我看到NR%40~/^1 ^ 2/1243也起作用了,这将打印1,2,3,4,41,42,43等,如OPrequest@merlin2011找到了一个更短的testing@Jotne,非常好我希望下次我问你关于如何缩短意大利面条awk代码的问题时,你能回答。@merlin2011谢谢。有时,我对实际工作的简短代码印象深刻。我做了很多测试来让它工作,它太好了,我把它添加到我的个人awk列表中。我确实试过像这样的NR%40==1 | 2 NR%40==1 | 2 NR%40==1 | 2/NR%40=/[1-2]/NR%40~1 | 2 NR%40~/1 | 2/NR%40~/[1-2]/不起作用,然后尽管关于限制使用“^和$”的字段,最终使它起作用了NR%40~/^[1-2]$/现在我看到NR%40~/^1/[1 ^ 2]/1243]也起作用了;N溶液不能给出正确的结果。试试下面的100 | sed'N;NNPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd’得到1234444448182848182838889909192939496979899100iter=1;而[$iter-lt 300];做国际热核聚变实验堆;设iter+=1;完成| sed'N;NNPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd’在我的AIX/bash/sed上给出1234444448182838412112212416116216420120220424124243244281282828283284。你的测试在我的Ubuntu 12.04和14.04上运行正常,但在seq 100 | sed上运行不正常-只是在linux上测试一下,和你提到的一样奇怪的行为。seq在之后生成不同的内容
第80行,但看不出有什么区别。81之后,每一行似乎都被打印出来了。由于未完成删除前最后一行的循环打印。我使用sed-nNow来调整脚本,使其按预期工作,并在测试文件上使用9.2秒,因此速度很快;N溶液不能给出正确的结果。试试下面的100 | sed'N;NNPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd’得到1234444448182848182838889909192939496979899100iter=1;而[$iter-lt 300];做国际热核聚变实验堆;设iter+=1;完成| sed'N;NNPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd’在我的AIX/bash/sed上给出1234444448182838412112212416116216420120220424124243244281282828283284。你的测试在我的Ubuntu 12.04和14.04上运行正常,但在seq 100 | sed上运行不正常-只是在linux上测试一下,和你提到的一样奇怪的行为。seq在第80行之后生成一些不同的内容,但看不出有什么不同。81之后,每一行似乎都被打印出来了。由于未完成删除前最后一行的循环打印。我使用sed-nNow对脚本进行了调整,使其按预期工作,并在测试文件上使用了9.2秒,因此速度很快。