重複行の大/小文字を区別せずに計算、重複数が最も多い大/小文字を選択して重複を削除

重複行の大/小文字を区別せずに計算、重複数が最も多い大/小文字を選択して重複を削除

コピーは他の大文字と小文字のテキストの組み合わせです。

重複項目の数を計算し(大文字と小文字を区別しない)、重複項目が最も多いケースを選択して重複項目を削除する必要があります。

以下の例:

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

POSIX的に:

<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

関連情報