do script abaixo:
EmpID:Name:Designation:UnitName:Location:DateofJoining:Salary
1001:Thomson:SE:IVS:Mumbai:10-Feb-1999:60000
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1003:Jackson:DM:IMS:Hyderabad:23-Apr-1985:90000
1004:BobGL::ETA:Mumbai:05-Jan-2004:55000
1005:Alice:PA:::26-Aug-2014:25000
1006:LilySE::IVS:Bangalore:17-Dec-2015:40000
1007:Kirsten:PM:IMS:Mumbai:26-Aug-2014:45000
1004:BobGL::ETA:Mumbai:05-Jan-2021:55000
Gostaria de obter a contagem de espaços em branco (que são representados como '::' ). Muito obrigado pelo seu apoio.
Supondo que você queira contar o número de campos vazios no seu arquivo CSV delimitado por dois pontos, podemos fazer isso com Miller (
mlr
) assim:Como Miller é ciente de CSV, isso também lida corretamente com campos que contêm dois pontos incorporados. Por exemplo, o seguinte CSV tem dois campos vazios (
Designation
eSalary
):Você pode encadear alguns utilitários padrão:
edição: Obrigado @Kusalananda pelo lembrete de usar
grep -c
em vez degrep | wc -l
ou use
awk
:Isto é, desde que os campos de entrada não contenham nenhum caractere LFnor .:
Você quer uma solução bash pura?
Exemplo de awk, que é POSIX!
ou
Festança:
Aqui estão uma
sed
implementaçãowc
e umabash
implementação pura, junto com código de exemplo para invocar ambas. Eu recomendaria a primeira.Uma coisa que seu formato de entrada implica, mas você não especifica, é que pode haver entradas em branco no início e no fim da linha. A implementação do sedwc considera isso adicionando dois pontos extras no início e no fim de cada linha. Se esses espaços em branco não devem ser contados, você pode remover o texto
s/^/:/;s/$/:/;
.Acho que vale a pena explicar a
sed wc
implementação:wc
's então gera o total de linhas, o total de palavras e o total de caracteres. Isso se traduz como: total de registros, registros com quaisquer espaços em branco e total de registros mais o total de espaços em branco. Um pouco de matemática simples então gera o total de espaços em branco.Usando Raku (anteriormente conhecido como Perl_6)
Raku é uma linguagem de programação da família Perl que é uma boa escolha se você estiver lidando com arquivos Unicode/UTF-8.
Acima, chamamos o Raku na linha de comando com os
-ne
sinalizadores linewise não autoprinting do tipo awk. NósBEGIN
declaramos uma variável de contador$i
. Para garantir a contagem correta de dois pontos adjacentes, usamos o:overlap
modificador (argumento nomeado).Exemplo de entrada:
Exemplo de saída:
6
Se você quiser ver as correspondências, basta adicionar uma
say
chamada, com++$
e=>
para fornecer os números das linhas:https://raku.org