不区分大小写的计数重复行,通过选择重复次数最高的大小写来删除重复项

不区分大小写的计数重复行,通过选择重复次数最高的大小写来删除重复项

副本是不同大小写文本的组合。

我需要计算重复项的数量(不区分大小写),然后我需要通过选择重复项最多的情况来删除重复项。

下面的例子:

hot chocolate
hot chocolate
hot chocolate
Hot Chocolate
Hot Chocolate
Hot Chocolate
Hot Chocolate
Hot Chocolate
Xicolatada
Xicolatada
Xicolatada
Xicolatada
XICOLATADA
XICOLATADA

应该变成:

Hot Chocolate, 8
Xicolatada, 6

这个问题类似于这个但我需要选择重复次数最多的情况并不区分大小写地进行计数。

答案1

还有uniq --ignore-case --count | sort --numeric --reverse

sort | uniq -ic /tmp/foo.txt | sort -nr
      8 hot chocolate
      6 Xicolatada

要切换顺序,请在其中添加逗号,然后将此管道添加到末尾:

... | sed -e 's/^ *\([0-9]*\) \(.*\)/\2, \1/'

请参阅下面的第一条评论,了解为什么我们有领先的排序。

答案2

我会用来tolower()将所有项目设为小写。然后就是将它们存储在数组中a[],然后打印结果:

$ awk '{a[tolower($0)]++} END {for (i in a) print i, a[i]}' file
xicolatada 6
hot chocolate 8

要以逗号分隔格式输出,请添加-v OFS=,.

答案3

这将为您提供所需的输出

use List::Util qw(sum);

my %count;
while (<>) {
    chomp;
    $count{+lc}{$_}++; 
}

$,=", ";
$\="\n";

while (my ($key, $hash) = each %count) {
    my @labels = reverse 
                 map  { $_->[0] }
                 sort { $a->[1] <=> $b->[1] } 
                 map  { [ $_, $hash->{$_} ] } 
                 keys %$hash;
    my $sum = sum values %$hash;

    print $labels[0], $sum;
}

然后

$ perl count.pl data.txt 
Hot Chocolate, 8
Xicolatada, 6

输出的顺序是不确定的。

答案4

POSIXly:

<in dd conv=lcase|LC_ALL=C sort|uniq -c >out

...打印...

8 hot chocolate
6 xicolatada

或者使用 GNU 工具:

<in LC_ALL=C sort -f|uniq -ic >out

...打印...

8 Hot Chocolate
6 XICOLATADA

你需要一个 GNU——uniq或者,无论如何,你需要一个支持-i不区分大小写选项的 GNU。无论如何,所有人都sort应该这样做-f

相关内容