Como mesclar e somar campos baseados em 2 colunas

2

Eu tenho um arquivo da seguinte forma:

Bitrate        ASNUM       TotalBytes    DownloadTime   NumberCount

280000          2856        61454           12

280000          2856        61428           14

1179968         2856        309430          11

1179968         4156        309200          15

4864960         2856        997962          193 

4864960         2856        1115576         300

4864960         2856        997962          116

Eu preciso mesclar as linhas com base nas primeiras 2 colunas, ou seja, taxa de bits e ASNUM e adicionar os campos Total Bytes e DownloadTimes correspondentes a elas.

A saída resultante deve ser a seguinte:

Bitrate        ASNUM      TotalBytes     DownloadTime   NumberCount 

280000          2856        122882          26               2  

1179968         2856        309430          11               1

1179968         4156        309200          15               1

4864960         2856        3111500         609              3  

onde a coluna adicional NumberCount indica o número de ocorrências.

Você poderia me ajudar com o código que eu posso implementar para que isso funcione?

    
por Shravan Alva 20.01.2017 / 13:53

2 respostas

2

Aqui está a solução usando o awk:

awk -F " " '
    NR==1 {print; next} 
    NF {a[$1" "$2]+=$3; b[$1" "$2]+=$4; c[$1" "$2]++} 
    END {for(i in a)print i, a[i], b[i], c[i]}
' file

- > inputFile deve estar no diretório onde você está executando o comando

- > -F "" considera um único espaço como o delimitador

- > NR == 1 {print; next} imprime os cabeçalhos para imprimir e pula

- > array a [$ 1 "" $ 2] considera o grupo pelo valor da primeira coluna e do valor da segunda coluna. O mesmo para o array b e c.

- > + operador = resume a coluna necessária com base no grupo por de matriz

- > Operador ++ usado com array c armazena a contagem no grupo por

- > O último loop "for" é usado para imprimir os resultados na saída

    
por 22.01.2017 / 04:46
1
O

datamash do GNU é feito para esse tipo de tarefa - por exemplo

datamash -WH -g 1,2 sum 3,4 count 4

ou mais detalhadamente

datamash --whitespace --headers \
  groupby Bitrate,ASNUM sum TotalBytes,DownloadTime count DownloadTime

(não importa qual dos campos não agrupados você especificar para o count ).

Seu caso é um pouco complicado pelas linhas em branco, mas você pode simplesmente retirá-las antes e adicioná-las novamente, por exemplo,

sed '/^$/d' file | datamash -WH -g 1,2 sum 3,4 count 4 | column -t | sed G
GroupBy(Bitrate)  GroupBy(ASNUM)  sum(TotalBytes)  sum(DownloadTime)  count(DownloadTime)

280000            2856            122882           26                 2

1179968           2856            309430           11                 1

1179968           4156            309200           15                 1

4864960           2856            3111500          609                3
    
por 20.01.2017 / 16:47