如何删除文本文件中句子之间的空行?

时间:2014-11-24 03:59:23

标签: sed grep gawk

我有一个文本文件,句子之间有很多空行。我使用sed,gawk,grep,但他们不工作。 :(。我现在该怎么办?谢谢。

Myfile:         Desired file:
a                    a
b                    b
c                    c
.                    .

d                    d
e                    e
f                    f
g                    g
.                    .

                     h
                     i
h                    j
i                    k
j                    .
k
.

5 个答案:

答案 0 :(得分:2)

可以使用awk

awk 'BEGIN{prev="x"}
     /^$/ {if (prev==""){next}}
          {prev=$0;print}'       inputFile

或压缩的一个衬垫:

awk 'BEGIN{p="x"}/^$/{if(p==""){next}}{p=$0;print}' inFl

这是一个简单的状态机,可将多个空白行折叠为单个行。

基本理念是这样的。首先,将上一行设置为非空。

然后,对于文件中的每一行,如果它和前一行是空白的,就把它扔掉。

否则,将上一行设置为该值,打印该行,然后继续。

示例脚本,以下命令:

$ echo '1
2
3
4
5

6
7
8
9


10' | awk 'BEGIN{p="x"}/^$/{if(p==""){next}}{p=$0;print}'

输出:

1
2
3
4
5

6
7
8
9

10

请注意,这是真正的空白行(没有内容)。如果您试图折叠具有任意数量的空格或制表符的行,那将会有点棘手。

在这种情况下,您可以通过以下方式管道文件:

sed 's/^\s*$//'

确保只有空格的行变为真空。

换句话说,比如:

sed 's/^\s*$//' infile | awk 'my previous awk command'

答案 1 :(得分:2)

使用GNU cat抑制重复的空输出行:

cat -s file1 > file2

答案 2 :(得分:0)

你也可以这样做,

awk -v RS="\0" '{gsub(/\n\n+/,"\n\n");}1' file

<强>解释

  • RS="\0"一旦我们将空字符设置为Record Seperator值,awk会将整个文件作为单个记录读取。
  • gsub(/\n\n+/,"\n\n");这会用一个空行替换一个或多个空行。请注意,\n\n正则表达式与空行以及上一行的换行符匹配。

答案 3 :(得分:0)

这是使用sed的一种方式:

sed ':a; N; $!ba; s/\n\n\+/\n\n/g' file

否则,如果您不介意尾随空行,您只需要:

awk '1' RS= ORS="\n\n" file

Perl解决方案更短:

perl -00 -pe '' file

答案 4 :(得分:0)

这是另一个awk

awk -v p=1 'p=="" {p=1;next} 1; {p=$0}' file