MEGOLDVA - leszámlálás

Van egy olyan fájlom, amelynek egy-egy sorában egy-egy (maximum ötjegyű) szám áll. A számok nemcsökkenő sorrendben következnek egymás után.
Tudtok javasolni olyan módszert, amellyel az előforduló számok darabszámát könnyen le tudom kérdezni? Valami uniq/wc/? kombinációra gondolok.
Pl. ilyen fájl esetén:
508
508
508
508
1104
1104
1104
1105
Ilyen megoldásra vágyom:
508: 4
1104: 3
1105: 1

Hozzászólások

Az is jó, ha írok egyet neked?

Fuszenecker Róbert

#include <iostream>
#include <map>

using namespace std;

int main()
{
  map<unsigned int, unsigned int> table;

  while (not cin.eof())
  {
    unsigned int num;
    cin >> num;

    table[num]++;
  }

  for (map<unsigned int, unsigned int>::iterator it = table.begin(); it != table.end(); ++it)
  {
    cout << it->first << ": " << it->second << endl;
  }

  return 0;
}

Ez a program szabad szoftver, szabadon terjeszthető és/vagy módosítható a GNU GPL 3-ban leírtak szerint.

Fuszenecker Róbert

awk '{szam[$0]++;} END { for ( i in szam ) { print i ": " szam[i]; } }'

szerk: lehagytam zárójelet

uniq -c adja a fordítottját, a te esetedben

4 508
3 1104
1 1105

uniq -c file.txt | sort -r -rel az előfordulások száma szerint csökkenőbe rendezheted.

még egy perles megoldás a teljes kielégülésért:

perl -nle '$h{$_}++}{print map{$_.": ".$h{$_}."\n"}sort{$a<=>$b}keys %h'