Usando o awk para calcular 'rolling max' e imprimir o respectivo registro da coluna 2

1

Aqui está o meu arquivo (na realidade, alguns milhões de linhas):

1   75
2   188
3   279
4   267
5   100
6   28
7   479
8   325
9   225
10  181

Eu quero encontrar o máximo da segunda coluna para as primeiras 5 linhas (linhas 1-5) e imprimir esse valor máximo, mas também o valor correspondente da primeira coluna. Em seguida, mova para as próximas cinco linhas (linhas 6-10) e faça o mesmo.

A saída deve ser:

3 279
7 479

Até agora eu posso calcular o rolamento máximo dessa maneira:

awk '{for(i=1;i<=NF;i++) if($i>maxval) maxval=$i;} NR%5==0 { print maxval; maxval= -1}' input.file

No entanto, não consegui imprimir o respectivo valor da primeira coluna. Eu tentei definir uma segunda variável como want=$1 e, em seguida, tentando print maxval, want , mas sem sucesso. Tenho uma vaga impressão de que isso poderia ser feito com matrizes, mas todas as minhas tentativas não tiveram sucesso.

TP

    
por ThePresident 29.06.2018 / 03:11

2 respostas

0

Eu não acho que passar por cima de campos seja o que você quer aqui. Em vez disso, basta olhar o número do registro (ou o número do registro do arquivo para permitir que ele trabalhe em vários arquivos) módulo 5:

$ awk '!((FNR-1)%5) || $2 > max {x = $0; max = $2} !(FNR%5) {print x}' file
3   279
7   479
  • se FNR for 1,6, ... OU $2 for maior que a corrente máxima, salve a linha atual / max

  • se FNR for 5,10, ... imprima a linha atual / max

por 29.06.2018 / 03:26
0

Não é uma resposta awk , mas para quem gosta de ferramentas shell, o método GNU split funciona:

split -l 5 --filter 'sort -n -k 2 | tail -1'  file
    
por 29.06.2018 / 05:57

Tags