【问题标题】:Delete repeated text between delimeters删除分隔符之间的重复文本
【发布时间】:2015-11-03 20:37:39
【问题描述】:

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

【问题讨论】:

    标签: bash duplicates


    【解决方案1】:

    这是awk 的工作:

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

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

    seen[$0] 检查我们是否已经看到了这个值。 $0 是整个记录,财富的文本,作为字符串。如果我们看到了值,我们将移动到下一条记录并且不打印任何内容。

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

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

    【讨论】:

    • 我不知道 RSORS 变量。这是我错过的关键。
    • 确实,它们非常强大!我建议始终考虑 records 而不是 lines
    【解决方案2】:

    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
    %
    $
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2016-03-30
      • 2021-07-10
      • 2020-02-09
      • 2019-04-06
      相关资源
      最近更新 更多