encontra o padrão de campo em um arquivo csv e, em seguida, conta valores de campo exclusivos

1

Estou usando o Cygwin (bash) para criar um script para localizar, agrupar e contar campos em vários arquivos CSV. Cada linha terá campos separados por vírgula com cada campo seguindo uma convenção semelhante. Há um valor numérico e, em seguida, um sinal de igual (=) e, em seguida, um valor alfanumérico. O "(número)=" pode ou não estar presente em uma linha e, se presente, a posição do campo pode variar, mas aparece apenas uma vez na linha. Além disso, o valor após o sinal de igual varia em comprimento.

Um exemplo do meu objetivo será o melhor. Arquivo CSV:

35=D,11=ABCD1,1=ABC,55=XYZ,38=100,40=P,18=M,54=1,59=0,10=111
35=D,11=ABCD2,1=ABC,55=XYZ,38=200,40=P,18=M,54=1,44=10.00,59=0,10=133
35=D,11=ABCD3,1=ABC,55=XYZ,38=300,40=P,18=M B,54=1,44=10.00,59=0,110=200,10=113
35=D,11=ABCD4,1=ABC,55=XYZ,38=400,40=P,18=M B F,54=1,44=10.00,59=0,110=300,10=144
35=D,11=ABCD5,1=ABC,55=ZYX,38=300,40=2,54=1,44=10.00,59=3,10=132
35=D,11=ABCD6,1=ABC,55=QQQ,38=100,40=1,18=C,54=2,59=3,10=131

Os valores do campo "18=" são separados por espaços. Eu gostaria de ter um script ou one-liner que identificasse cada valor "18=" exclusivo e, em seguida, contasse a aparência de cada um. A saída usando o arquivo acima seria (o tipo é opcional):

18=M 2
18=M B 1
18=M B F 1
18=C 1

Como mencionado, esse script deve ler vários arquivos com registros nesse formato. Eu tentei diferentes combinações de grep e me interessei com awk , mas estou menos familiarizado com sua implementação adequada.

As duas primeiras respostas funcionam (muito obrigado!). Seria possível expandir para agregar os valores "38=" agrupados pelos resultados de contagem "18=" exclusivos?

    
por Prev66 10.11.2014 / 20:21

2 respostas

1

Você tenta a combinação?

grep -ho "18=[^,]*" list_of_files | sort | uniq -c
    
por 10.11.2014 / 20:49
1

Isso é provavelmente o melhor feito em Perl com uma estrutura hash:

perl -nle '($x)=/(18=[^,]+)/;$y{$x}++; END{print "$_ $y{$_}" for keys %y}' files

Explicação

Para cada linha, Perl procura por 18= seguido por tantos caracteres não-vírgula quanto possível; seja o que for que encontrar, armazena na variável $x . Essa variável é então usada como uma chave para o hash %y , cujo valor associado é incrementado para cada chave $x found.

No mesmo END ( ie , depois de todas as linhas terem sido processadas), imprimimos as chaves ( 18=... fields) e os valores associados (número de ocorrências) da variável hash %y .

    
por 10.11.2014 / 20:26