2014-11-24 63 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 
相關問題