2014-11-24 69 views
1

我有一个文本文件,在句子之间有许多空行。我用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 
. 
+0

爱丽丝,因为无论是高得分答案(我和Cyrus')在Cygwin下工作得很好,它看起来更像是其他问题。你确定这些行是空白的,而不是在它们中有一些空格?如果他们这样做,我的答案会有一个小小的改变(这对于Cyrus来说也是有效的),将空白线条折叠到真正的空行。 – paxdiablo 2014-11-24 08:48:26

+0

谢谢@paxdiablo,我会尝试在我的文件中发现一些其他问题。我试图使用sed,使他们都真正的空行,但它不工作。感谢您的帮助。 :) – Alice 2014-11-24 09:15:54

回答

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' 
+0

谢谢@paxdiablo!但它不适用。我收到的输出文件是一个空文件。我使用gawk而不是awk,因为我的系统是GNU。 – Alice 2014-11-24 04:28:32

+0

@爱丽丝,它用'gawk' - 'GNU Awk 4.1.1,API:1.1(GNU MPFR 3.1.2,GNU MP 6.0.0)'来测试,所以如果出现问题,我怀疑它可能会与你的文件或调用。你使用你的特定文件名而不是我的样本'inputFile',是的? – paxdiablo 2014-11-24 04:31:15

+0

是的,首先,我用我自己的数据,但后来我用上面的示例文件尝试了两个命令,但我收到了: ?a b c . Alice 2014-11-24 05:09:38

0

你可以做这样也,

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

说明:

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

谢谢@Avinash Rai,因为我的GNU系统,我使用gawk而不是awk。注意到: gawk:cmd。行:1:\ 0 gawk:cmd。行:1:^反斜杠不是行 – Alice 2014-11-24 04:48:13

+0

上的最后一个字符这可能很好地解决了这个问题,但如果你能够更多地解释它是如何/为什么解决这个问题的话,那将是非常好的。不要忘记,在S/O上有许多等级新手,而对你来说很明显的可能不是他们。如果你给他们机会,他们可以从你那里学到一两件东西:) – 2014-11-24 04:51:36

+1

@TarynEast补充。 – 2014-11-24 04:57:56

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 
+0

谢谢@Steve,但其中三人似乎不适合我。我收到一个相同的文件,在最后文件中输入一个或两个额外的空行。 – Alice 2014-11-24 08:40:52

+0

@Alice:您可能需要先运行'dos2unix file'。 – Steve 2014-11-24 22:34:01

2

为了抑制重复空输出线与GNU猫:

cat -s file1 > file2 
+0

谢谢@Cyrus。但是我收到了你的命令的原始文件。 – Alice 2014-11-24 08:00:51

0

这里是一个其他awk

awk -v p=1 'p=="" {p=1;next} 1; {p=$0}' file 
相关问题