コピーは他の大文字と小文字のテキストの組み合わせです。
重複項目の数を計算し(大文字と小文字を区別しない)、重複項目が最も多いケースを選択して重複項目を削除する必要があります。
以下の例:
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
。