Soma Primeira Coluna na base da Segunda Coluna

0

Eu escrevi um script Bash que armazena o número de registros (contagem de linhas) em um arquivo e o nome do arquivo que está presente no diretório em um arquivo output.txt.

O arquivo output.txt é como abaixo.

No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

Resultados obrigatórios

output.txt

No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

TOTAL :
1714083  UnixfileName
295169219 NextUnixFileName

Nota:

Some o No.ofRecord se o nome do arquivo for UnixFileName

Some o No.ofRecord if Nome do arquivo como NextUnixFileName.

Obrigado antecipadamente.

    
por Satya 27.01.2018 / 08:28

1 resposta

1

$ awk 'NR > 1 { k = substr($2, 4); cnt[k] += $1 } { print } END { print "\nTOTAL:"; for (k in cnt) print cnt[k], k }' file
No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

TOTAL:
1714083 UnixfileName.txt
295169219 NextUnixFileName.txt

O script awk resume a primeira coluna com base em uma chave k , que é considerada a segunda coluna do seu quarto caractere em diante. Isso é feito para toda a linha de entrada do arquivo, exceto a primeira (que é um cabeçalho). Todas as linhas de entrada são transmitidas sem modificação como saída.

No final, os totais são impressos para cada chave encontrada.

Para obter a mesma largura de coluna nos totais do resto dos dados, esse último print cnt[k], k pode ser alterado para uma variação de

printf("%-15d%s\n", cnt[k], k)

que formata o número como um inteiro com largura de 15 caracteres justificado à esquerda.

    
por 27.01.2018 / 08:51

Tags