2015-11-03 49 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 
% 
$