Como imprimir uma contagem incremental de ocorrências de valores únicos na coluna 1

6

Estou tentando encontrar uma solução para esse problema, preciso contar incrementalmente e imprimir as contagens dos valores exclusivos na coluna 1 de um arquivo de texto delimitado por tabulações. Aqui está um exemplo:

Apple_1   1      300
Apple_2   1      500
Apple_2   500    1500
Apple_2   1500   2450
Apple_3   1      1250
Apple_3   1250   2000

E a saída desejada é:

Apple_1   1      300     1
Apple_2   1      500     1
Apple_2   500    1500    2
Apple_2   1500   2450    3
Apple_3   1      1250    1
Apple_3   1250   2000    2

Eu sei que posso imprimir o número da linha no awk com apenas print NR, mas não sei como redefini-lo para cada valor exclusivo da coluna 1.

Obrigado por qualquer ajuda que você possa oferecer, eu agradeço.

    
por jpalmer 05.03.2015 / 00:01

2 respostas

6

O truque padrão para esse tipo de problema no Awk é usar um array de contador associativo:

awk '{ print $0 "\t" ++count[$1] }'

Isso conta o número de vezes que a primeira palavra de cada linha foi vista. Não é bem o que você está pedindo, já que

Apple_1   1      300
Apple_2   1      500
Apple_1   500    1500

produziria

Apple_1   1      300     1
Apple_2   1      500     1
Apple_1   500    1500    2

(a contagem de Apple_1 não é redefinida quando vemos Apple_2 ), mas se a entrada for classificada, você estará OK.

Caso contrário, você precisaria acompanhar um contador e uma última chave:

awk '{ if (word == $1) { counter++ } else { counter = 1; word = $1 }; print $0 "\t" counter }'
    
por 05.03.2015 / 00:14
2

Esta resposta não fornece o resultado exato que você especificou, , mas pode ser de interesse ainda maior para outros usuários.

Se você não precisa de contagens incrementais , mas apenas contagens de cada valor único, você pode usar o mais simples:

cut -f1 file.txt | sort | uniq -c

(Observe que cut depende dos delimitadores de tabulação, não apenas de qualquer espaço em branco).

Na verdade, como seu arquivo já está classificado no primeiro campo, não é necessário classificá-lo:

cut -f1 file.txt | uniq -c

E se você quiser incluí-los no arquivo original como uma nova quarta coluna, use join :

cut -f1 file.txt | uniq -c | join -2 2 file.txt -

( join depende da entrada classificada.)

A saída na entrada fornecida é:

Apple_1 1 300 1
Apple_2 1 500 3
Apple_2 500 1500 3
Apple_2 1500 2450 3
Apple_3 1 1250 2
Apple_3 1250 2000 2

Observe que join lê os delimitadores de espaço em branco de maneira intuitiva, seja guias ou espaços, mas gera exatamente um espaço para um delimitador. Se você quiser suas guias de volta, canalize para tr ' ' '\t'

    
por 02.11.2016 / 06:14

Tags