Comando mais simples para imprimir valores únicos de alguns dados de coluna com contagem de valores repetidos

0

Uma amostra de dados de entrada com 3 colunas, 1ª e 3ª colunas tem valores duplicados, precisa imprimi-los exclusivamente com a contagem de repetições.

class -u ajuda em algum sentido, mas não consegue imprimir a ocorrência de valores repetidos relacionados à 1ª e 3ª coluna.

Input :
A 3210 -06:00
A 5172 -06:00
A 3335 -07:00
A 3258 -05:00
B 3322 -05:00
B 5097 -05:00
C 3238 -06:00
C 5364 -05:00
C 3366 -06:00
C 3293 -06:00

Saída:

A(2) -06:00 
A(1) -07:00
A(1) -05:00
B(2) -05:00
C(3) -06:00
C(1) -05:00

ou

Saída:

A 2 -06:00 
A 1 -07:00
A 1 -05:00
B 2 -05:00
C 3 -06:00
C 1 -05:00
    
por Bharat 11.04.2018 / 20:50

3 respostas

2
  1. Em Entrada , use cut , sort , uniq e sed :

    cut -d ' ' -f1,3 Input | 
    sort | uniq -c | 
    sed 's/^ *//;s/^\([0-9]*\) \([^ ]*\)/ /'
    
  2. Usando datamash e sed :

    datamash -t ' ' -g1,3 -s countunique 2 < Input | 
    sed 's/\(.*\) \(.*\) \(.*\)/  /'
    

Saída de qualquer um:

A 1 -05:00
A 2 -06:00
A 1 -07:00
B 2 -05:00
C 1 -05:00
C 3 -06:00
    
por 11.04.2018 / 21:11
3

Não é exatamente o formato que você quer, mas se encaixa em todos os outros requisitos:

awk '{print $1" "$3}' <inFile> | sort | uniq -c

Em inglês, use o awk para imprimir apenas a primeira e a terceira colunas, depois classifique e, em seguida, uniq com count.

    
por 11.04.2018 / 21:03
3
$ awk '{ count[$1,$3]++ } END { for (i in count) { split(i, field, SUBSEP); printf("%s(%d)%s%s\n", field[1], count[i], OFS, field[2]) } }' file
A(1) -07:00
B(2) -05:00
A(2) -06:00
A(1) -05:00
C(3) -06:00
C(1) -05:00

Observe que a saída pode não estar classificada. Passe por sort , se necessário.

O código armazena a contagem de quantas vezes o primeiro e o terceiro campos da entrada ocorreram juntos como um par, na matriz count (com o primeiro e o terceiro campos como o índice). No final, fazemos um loop pelos índices da matriz, dividindo-os nos primeiros e terceiros campos originais (como field[1] e field[2] , respectivamente) e geramos esses resultados junto com a contagem no formato desejado.

No formato alternativo:

Se o arquivo de entrada usar um único espaço para o separador de campos (caso contrário, use awk '{ print $1,$3 }' em vez de cut ):

$ cut -d ' ' -f 1,3 file | sort | uniq -c
   1 A -05:00
   2 A -06:00
   1 A -07:00
   2 B -05:00
   1 C -05:00
   3 C -06:00

Para trocar as duas primeiras colunas:

$ cut -d ' ' -f 1,3 file | sort | uniq -c | awk '{ print $2, $1, $3 }'
A 1 -05:00
A 2 -06:00
A 1 -07:00
B 2 -05:00
C 1 -05:00
C 3 -06:00
    
por 11.04.2018 / 21:13