删除分隔符

时间:2015-11-03 20:37:40

标签: bash duplicates

我有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解决这个问题,但任何工具都没问题。

2 个答案:

答案 0 :(得分:4)

这是awk的工作:

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

RS='%'表示我们使用%作为记录分隔符。

seen[$0]检查我们是否已经看到此值。 $0是整个记录,即财富的文本,作为字符串。如果我们已经看到了我们正在转移到下一张唱片的价值并且没有打印任何内容。

{seen[$0]=1}将记录添加到查找表中。 1打印当前记录,因为它始终为真。请注意,此代码仅在我们之前未看到该记录时执行,因为之前的next语句。

ORS='%'将输出记录分隔符设置为%

答案 1 :(得分: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
%
$