Como combinar linhas e números

4

Eu tenho um arquivo txt como:

Large 0
Large 0 
Large 1
Large 2
Medium 0
Medium 1
Medium 1    
small 1
small 3

Eu quero combinar todas as diferentes linhas grandes, médias e pequenas para gerar algo como:

Large 3
Medium 2
Small 4

Eu tenho outro problema que é semelhante, mas o outro arquivo é apenas palavras, como:

MVCC Cybersecurity
MVCC Cybersecurity
MVCC Cybersecurity

Eu quero que ele gere a quantidade combinada de graus, de modo que a quantidade combinada de vezes diga segurança cibernética.

MVCC 3
    
por Pat 09.03.2017 / 05:32

3 respostas

5

perl -lane '@F == 2 and $h{$F[0]}+=$F[1]}{print "$_ $h{$_}" for keys %h' yourfile

Ler é: quando suas linhas tiverem exatamente dois campos, atualize um valor de hash com o segundo campo para a chave ser a primeira chave. No final de tudo, basta imprimir a chave e o valor correspondente.

estrutura de dados para o hash% h é:

% h = ( ...    GRANDE = > running_sum, ... );

Awk

awk '
   NF == 2 { seen[$1] += $2 }
   END{
      for(i in seen)
         print i, seen[i]
   }
' yourfile
    
por 09.03.2017 / 05:44
2

Dê uma olhada no gnu datamash :

$ datamash -W -g 1 sum 2 < ex.txt
Large   3
Medium  2
small   4
  • coluna -W separada por espaços em branco (def. é guias)
  • -g 1 group por coluna 1
  • sum 2 coluna de soma 2

O segundo exemplo não foi muito claro; O seguinte apenas conta o número de ocorrências ...

$ datamash -W -g 1 count 2 < ex2.txt
MVCC 3
    
por 09.03.2017 / 10:26
2

Usando o groupby ()

do python

Um bom trabalho para python ( itertools ) groupby () . Abaixo dois pequenos scripts para ambas (partes de) sua (s) pergunta (s).

Basta copiar o código em um arquivo vazio, definir o caminho para o seu arquivo de texto e executá-lo pelo comando:

python3 /path/to/script.py

A primeira parte da sua pergunta; recebendo totais

#!/usr/bin/env python3
from itertools import groupby
from operator import itemgetter
f = '/path/to/file'
for i, n in groupby([l.split() for l in open(f)], itemgetter(0)):
    print(i, sum([int(n[1]) for n in list(n)]))

onde f é o caminho para o seu arquivo, entre aspas

saída:

Large 3
Medium 2
small 4

A segunda parte da sua pergunta, contando linhas com primeira coluna semelhante

É uma edição simples para a primeira:

#!/usr/bin/env python3
from itertools import groupby
from operator import itemgetter
f = '/path/to/file'
for i, n in groupby([l.split() for l in open(f)], itemgetter(0)):
    print(i, len(list(n)))

em que f (novamente) é o caminho para o seu arquivo, entre aspas.

Em um arquivo:

MVCC Cybersecurity
MVCC Cybersecurity
MVCC Cybersecurity
Monkey Cybersecurity
Monkey Cybersecurity

Dá a saída:

MVCC 3
Monkey 2

Nota

No seu exemplo, as linhas são classificadas. Presumi, portanto, que não precisamos classificar as linhas primeiro. Se suas linhas não estão classificadas, por favor mencione.

Explicação

[l.split() for l in open(f)]

abre o arquivo f , lê suas linhas e as divide.

groupby([l.split() for l in open(f)], itemgetter(0))

subsequentemente grupos as linhas pelo primeiro item e

sum([int(n[1]) for n in list(n)])

soma o total dos números nas linhas agrupadas.

    
por 09.03.2017 / 10:04

Tags