Estou tentando contar quantas vezes utilizo uma determinada versão de uma biblioteca no meu computador.
Por algum motivo, uniq -c
está gerando duplicatas, apesar de classificá-las e apesar da ordem de classificação parecer correta.
Alguma ideia ou feedback?
Obrigado pelo seu tempo.
Comuniq -c
Entrada:
rg --no-line-number --no-filename -g '*.csproj' "GitVersion.MsBuild" | sed -E '/GitVersion\.MsBuild" Version/!d;s/^\s\+//g;/<!/d;s/^.+(GitVersion.MsBuild)" Version="(.+)">/\1 \2/g' | sort -n | uniq -c
Saída:
3 GitVersion.MsBuild 5.10.1
1 GitVersion.MsBuild 5.10.1
3 GitVersion.MsBuild 5.10.3
11 GitVersion.MsBuild 5.11.1
5 GitVersion.MsBuild 5.11.1
25 GitVersion.MsBuild 5.12.0
2 GitVersion.MsBuild 5.12.0
1 GitVersion.MsBuild 5.6.11
2 GitVersion.MsBuild 5.7.0
4 GitVersion.MsBuild 5.8.1
Semuniq -c
Entrada:
rg --no-line-number --no-filename -g '*.csproj' "GitVersion.MsBuild" | sed -E '/GitVersion\.MsBuild" Version/!d;s/^\s\+//g;/<!/d;s/^.+(GitVersion.MsBuild)" Version="(.+)">/\1 \2/g' | sort -n
Saída:
GitVersion.MsBuild 5.10.1
GitVersion.MsBuild 5.10.1
GitVersion.MsBuild 5.10.1
GitVersion.MsBuild 5.10.1
GitVersion.MsBuild 5.10.3
GitVersion.MsBuild 5.10.3
GitVersion.MsBuild 5.10.3
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.6.11
GitVersion.MsBuild 5.7.0
GitVersion.MsBuild 5.7.0
GitVersion.MsBuild 5.8.1
GitVersion.MsBuild 5.8.1
GitVersion.MsBuild 5.8.1
GitVersion.MsBuild 5.8.1
Atualizei meu comando para canalizar xxd
conforme sugestão de @kos. Isso ajudou na comparação.
rg --no-line-number --no-filename -g '*.csproj' "GitVersion.MsBuild" | sed -E '/GitVersion\.MsBuild" Version/!d;s/^\s\+//g;/<!/d;s/^.+(GitVersion.MsBuild)" Version="([0-9\.]+)">/\1 \2/g' | sort -n | uniq -c | xxd
Isso rendeu (desculpe pela captura de tela, mas ajuda ter as cores).
Em seguida, revisei um pouco o regex (desculpe, não aceitei todas as sugestões, já que um pequeno ajuste fez com que funcionasse, mas devo dizer que aprendi muito com isso, inclusive usando xxd
)
Eu simplesmente adicionei .*
depois de >
:
rg --no-line-number --no-filename -g '*.csproj' "GitVersion.MsBuild" | sed -E '/GitVersion\.MsBuild" Version/!d;s/^\s\+//g;/<!/d;s/^.+(GitVersion.MsBuild)" Version="([0-9\.]+)">.*$/\1 \2/g' | sort | uniq -c
E agora produz a saída correta (ou satisfatória de qualquer maneira):
4 GitVersion.MsBuild 5.10.1
3 GitVersion.MsBuild 5.10.3
16 GitVersion.MsBuild 5.11.1
27 GitVersion.MsBuild 5.12.0
1 GitVersion.MsBuild 5.6.11
2 GitVersion.MsBuild 5.7.0
4 GitVersion.MsBuild 5.8.1
Obrigado equipe!
uniq -c
conta os comprimentos de sequências de linhas consecutivas agrupadas igualmente na localidade do usuário (para as quaisstrcoll(line1, line2)
retorna 0).Se você pegar:
Com duas linhas aparentemente idênticas sendo consecutivas, isso só pode sugerir que elas não são idênticas (e não são agrupadas igualmente).
A explicação mais provável é que existam variações de caracteres invisíveis ali.
Sendo arquivos relacionados à Microsoft, provavelmente existem caracteres CR no final das linhas, embora também possam ser espaços ou tabulações que também podem ocorrer naturalmente em arquivos XML.
Seu código provavelmente deveria ser:
Onde:
s/^\s\+//g
removido porque não serve a nenhum propósito (mesmo se for corrigidos/^\s+//
).sort -n
(o que é inútil, pois as linhas não começam com um número) substituído porsort -V
(para version sort , uma extensão GNU)..*
é adicionado depois de">
qualquer coisa depois de ser descartado, incluindo espaço, tabulação, CR ou quaisquer outros caracteres invisíveis.g
é removido porque esse padrão só pode corresponder uma vez.sed -n
em combinação com op
sinalizador dos
comando sed é usado para garantir que apenas as linhas correspondentes sejam impressas.Ou faça tudo em
rg
:Ou
pcregrep
/pcre2grep
:(usando
--iglob
e(?i)
como me disseram, os sistemas da Microsoft tendem a não se importar com maiúsculas e minúsculas nos nomes dos arquivos)Se esses forem de fato arquivos XML, você também poderá processá-los com utilitários compatíveis com XML, como
xq
: