SQL gosta de agrupar por e soma para arquivos de texto na linha de comando?

7

Eu tenho enormes arquivos de texto com dois campos, o primeiro é uma string, o segundo é um inteiro. Os arquivos são classificados pelo primeiro campo. O que eu gostaria de obter na saída é uma linha por string única e a soma dos números das strings idênticas. Algumas strings aparecem apenas uma vez, enquanto outras aparecem várias vezes. Por exemplo. Dados os dados da amostra abaixo, para a string glehnia, gostaria de obter 10 + 22 = 32 no resultado.

Alguma sugestão de como fazer isso com as ferramentas de linha de comando do gnuwin32 ou no shell do linux?

Obrigado!

glehnia 10
glehnia 22
glehniae 343
glehnii 923
glei 1171
glei 2283
glei 3466
gleib 914
gleiber 652
gleiberg 495
gleiberg 709

    
por dnkb 02.05.2010 / 06:25

4 respostas

5

No AWK, você poderia fazer algo assim:

awk '($1 == last) || (last == "") {sum += $2}
     ($1 != last) && (last != "") {print last " " sum; sum = $2}
                                  {last = $1}
     END                          {print last " " sum}' huge_text_file.txt
    
por 02.05.2010 / 10:35
2

Esse tipo de consulta é feito de maneira mais fácil e flexível no SQL. Você pode usar o SQLet e o SQLite para esse fim:

sqlet.py -d' ' -A file1.txt 'select a1, sum(a2) from A group by a1' | sqlite3
    
por 25.10.2013 / 12:12
1

Você poderia usar algumas linhas de Lua para conseguir isso. Lua está disponível em uma ampla variedade de plataformas, incluindo Windows e Linux.

-- Quick and dirty - no error checking, unsorted output

io.input('huge_text_file.txt')

results = {}

for line in io.lines() do
    for text, number in string.gmatch(line, '(%w+)%s+(%d+)') do
        results[text] = (results[text] or 0) + number
    end
end

for text, number in pairs(results) do
    print(text, number)
end

Você pode classificar a saída usando qualquer utilitário de classificação ou mais algumas linhas de Lua.

    
por 02.05.2010 / 10:15
1

Você pode usar o comando uniq , por exemplo

cat file | uniq -u -c

onde: -c - o número de ocorrências -u - imprimir apenas linhas exclusivas

    
por 08.02.2014 / 23:14