Contar e somar não. de ocorrências de cada linha única em um arquivo [duplicado]

4

Acho que a resposta para esse problema pode ser algum tipo de variante da função uniq que permite contar o número de vezes que cada linha aparece em um arquivo:

sort file.txt | uniq -c

O problema para mim é que usei essa função uniq para gerar uma contagem de linhas e, como estou mesclando a saída com outros arquivos, acabo com linhas duplicadas no arquivo que precisam de mais racionalização.

Por exemplo, com a contagem original da linha uniq no início de cada linha:

34 banana

23 apple

48 grapefruit

23 banana

12 apple

Então, o que eu preciso fazer é:

57 banana

35 apple

48 grapefruit

Existe alguma função que irá SUM no primeiro campo, em todos os casos em que os campos restantes são idênticos?

    
por Simonmdr 01.05.2015 / 11:23

2 respostas

6

Uma solução awk :

$ awk '{i[$2]+=$1} END{for(x in i){print i[x]" "x}}' file.txt
35 apple
48 grapefruit
57 banana

Primeiro awk faz um array cujo índice é o nome (banana, maçã, grapefruit) e soma os valores na primeira coluna. No final, essa matriz é impressa.

    
por 01.05.2015 / 11:57
0

Eu usaria perl.

#!/usr/bin/perl

use strict; 
use warnings;

my %count_of;

while ( <> ) {
   my ( $word) = m/(\w+)/;
   $count_of{$word}++;
}

foreach my $word ( sort { $count_of{$a} <=> $count_of{$b} } keys %count_of ) {
    print "$count_of{$word} $word\n";
}

Execute com perl script.pl file1 file2 file3 file4 .

Alternativamente - você provavelmente quer apenas usar cat.

cat file1 file2 file3 | sort | uniq -c
    
por 01.05.2015 / 11:31

Tags