Ruby 如何从文本块中删除重复项

Ruby 如何从文本块中删除重复项,ruby,perl,awk,sed,Ruby,Perl,Awk,Sed,删除文本文件中块内的重复项是一种智能而简单的方法。每个块由两条换行线分隔 之前: apple banana apple cherry cherry delta epsilon delta epsilon apple pie delta delta 之后: apple banana cherry delta epsilon apple pie delta 谢谢。应该在Mac上工作。允许使用unicode。任何shell方法/语言/命令。重复不一定是连续的。如果您忽略前导/尾随空格,或者

删除文本文件中块内的重复项是一种智能而简单的方法。每个块由两条换行线分隔

之前:

apple
banana
apple
cherry
cherry

delta
epsilon
delta
epsilon

apple pie
delta
delta
之后:

apple
banana
cherry

delta
epsilon

apple pie
delta
谢谢。应该在Mac上工作。允许使用unicode。任何shell方法/语言/命令。重复不一定是连续的。如果您忽略前导/尾随空格,或者可以在记录中使用逗号作为分隔符,则会获得额外奖励

$ awk '!NF{delete seen} !seen[$0]++' file
apple
banana
cherry

delta
epsilon

apple pie
delta
忽略(与删除相反),gensub()的带有GNU awk的前导/尾随空格应为:

$ awk '!NF{delete seen} !seen[gensub(/^\s+|\s+$/,"","g")]++' file
我不知道你所说的
是什么意思。在这种情况下,你可以在记录中使用逗号作为分隔符

忽略(与删除相反),gensub()的带有GNU awk的前导/尾随空格应为:

$ awk '!NF{delete seen} !seen[gensub(/^\s+|\s+$/,"","g")]++' file
我不知道你所说的
是什么意思,在这个上下文中,你可以用逗号作为记录中的分隔符。

RUBY

text =<<_
apple
banana
apple
cherry
cherry

delta
epsilon
delta
epsilon

apple pie
delta
delta
_

r1 = /
     (?<=\n) # match a newline in a positive lookbehind
     \n      # match a newline
     /x      # extended/free-spacing regex definition mode

r2 = /
     (?<=\n) # match a newline in a positive lookbehind
     /x

puts text.split(r1).map { |s| s.split(r2).uniq.join }.join("\n")
  # apple
  # banana
  # cherry

  # delta
  # epsilon

  # apple pie
  # delta
鲁比

这可能适用于您(GNU-sed):

在模式空间(PS)中存储行,直到出现空行或文件结尾。最后一行读取的模式与前一行匹配,如果匹配,则删除最后一行。如果最后一行是空的(或文件末尾),请打印PS中保留的所有行。

这可能适用于您(GNU-sed):

在模式空间(PS)中存储行,直到出现空行或文件结尾。最后一行读取的模式与前一行匹配,如果匹配,则删除最后一行。如果最后一行为空(或文件末尾),请打印PS中保留的所有行。

给定:

$ cat file
apple
banana
apple
cherry
cherry

delta
epsilon
delta
epsilon

apple pie
delta
delta

可以使用Ruby的段落模式命令行开关将空白行作为每个记录的定界符,并将字段分隔符设置为每个字段的“代码>\n\/Cuth>”。然后,对每个块进行整修:

$ ruby -00 -F'\n' -lane '$><<$F.uniq.join("\n")<<"\n\n"' file
apple
banana
cherry

delta
epsilon

apple pie
delta
鉴于:

可以使用Ruby的段落模式命令行开关将空白行作为每个记录的定界符,并将字段分隔符设置为每个字段的“代码>\n\/Cuth>”。然后,对每个块进行整修:

$ ruby -00 -F'\n' -lane '$><<$F.uniq.join("\n")<<"\n\n"' file
apple
banana
cherry

delta
epsilon

apple pie
delta

嗨,艾德,哇!太棒了!我觉得这是如此短暂和优雅,我应该知道它。太好了,谢谢。我可以经常使用它。哦,用逗号,我的意思是也可以处理这种格式:苹果,香蕉,苹果,香蕉\n这也会删除以前阻止的所有项目。哇!太棒了!我觉得这是如此短暂和优雅,我应该知道它。太好了,谢谢。我可以经常使用它。哦,用逗号,我的意思是也可以处理这种格式:apple、banana、apple、banana\n这也将删除前面块中看到的任何项目
$ ruby -00 -F'\n' -lane '$><<$F.uniq.join("\n")<<"\n\n"'
   ^                                                      # ruby 1.9+ only I think
        ^                                                 # split records by \n\n
            ^                                             # split fields by \n
                   ^                                      # options to:
                                                            -l loop over input
                                                             a auto split
                                                             n don't auto print
                                                             e compile command line
                         ^                                # to STDOUT
                           ^                              # append
                             ^                            # the split fields
                                 ^                        # made uniq
                                     ^                    # join back to a string
                                          ^               # add back the record separator   
$ ruby -00 -F'\n' -lane 'h=Hash.new(0)
                         $F.each {|f| h[f]+=1 }
                         p h
                         puts h.keys.join("\n")<<"\n\n"
                         ' file
{"apple"=>2, "banana"=>1, "cherry"=>2}
apple
banana
cherry

{"delta"=>2, "epsilon"=>2}
delta
epsilon

{"apple pie"=>1, "delta"=>2}
apple pie
delta 
$ ruby -00 -F'\n|,' -lane '$><<$F.uniq.join("\n")<<"\n\n"' file