Awk 如何删除一个空行和下一个非空行

Awk 如何删除一个空行和下一个非空行,awk,sed,Awk,Sed,我有一个具有结构的两列文件 1 2 10 1 10 1 10 3 102 40 102 40 25 5 53 4 53 4 35 6 64 5 456 4 456 4 243 535 435 6

我有一个具有结构的两列文件

1 2
10 1

10 1
10 3
102 40


102 40 
25 5
53 4

53 4
35 6
64 5
456 4


456 4
243 535
435 6
<空白行上方和下方的数字相同。但是空白行不一致(它们是单一的、双的或三重的)。我想在每个空白行和空白行之后删除这个数字。 我的预期输出应该是这样的

1 2
10 1
10 3
102 40

25 5
53 4
35 6
64 5
456 4

243 535
435 6
我尝试过这样做:

sed -e '/pattern/,+1d' input_file 

您可以看到我的模式在变化,我未能解决问题。

使用GNU sed和足够小的输入文件以容纳内存:

$ # or: perl -0777 -pe 's/\n\n\N+//g' ip.txt
$ sed -zE 's/\n\n[^\n]+//g' ip.txt
1 2
10 1
10 3
102 40

25 5
53 4
35 6
64 5
456 4

243 535
435 6
这将匹配空行,并且仅当它包含任何字符时才删除另一行。
sed
解决方案假定输入不包含ASCII NUL字符,因为
-z
使用NUL作为行分隔符


使用
GNU awk

awk -v RS='\n\n[^\n]+' -v ORS= '1' ip.txt
这可能适用于您(GNU-sed):

在整个文件长度上打开一个两行窗口

如果窗口的第一行为空,第二行为空,则删除这两行

否则,打印/删除第一行并重复

sed 'N;/^\n\S/d;P;D' file