2015-11-03 77 views
4

我有一個數據文件fortune包含許多重複的命運。我想刪除它們。刪除重複文本之間的間隔

財富被%的劃定,所以樣本財富文件可能是這樣的:

% 
This is sample fortune 1 
% 
This is 
sample fortune 2 
% 
This fortune 
is repeated 
% 
This is sample fortune 3 
% 
This fortune 
is repeated 
% 
This fortune 
is unique 
% 

正如你所看到的,命運可以在多行跨越,呈現solutions here沒用。

我該怎麼做才能找到並消除重複的命運?我想找到一種方法來讓awk忽略以%開頭的行,但有些命運共享相同的行,但總體上並不相同(比如我的例子中的最後兩行),所以這還不夠。

到目前爲止,我一直試圖解決這個與awk,但任何工具都很好。

回答

4

這對awk工作:

awk 'seen[$0]{next}{seen[$0]=1}1' RS='%' ORS='%' fortune 

RS='%'意味着我們正在使用%作爲記錄分隔符。

seen[$0]檢查我們是否已經看到此值。 $0是整個記錄,命運的文本,作爲字符串。如果我們看到了我們正在轉向下一個記錄的價值,並且不打印任何東西。

{seen[$0]=1}將記錄添加到查找表中。 1打印當前記錄,因爲它始終爲真。請注意,由於之前的next聲明,此代碼只會在我們之前沒有看過記錄時才執行。

ORS='%' set的輸出記錄分隔符爲%

+0

我不知道'RS'和'ORS'變量。這是我錯過的關鍵。 – SnoringFrog

+1

確實,它們非常強大!我建議總是考慮*記錄*而不是*行* – hek2mgl

4

awk可以處理它。將記錄分隔符設置爲"%\n",然後打印唯一條目:

awk 'BEGIN{RS="%\n"} { if (! ($0 in fortunes)) { fortunes[$0]++; print $0 "%"} }' data 
% 
This is sample fortune 1 
% 
This is 
sample fortune 2 
% 
This fortune 
is repeated 
% 
This is sample fortune 3 
% 
This fortune 
is unique 
% 
$