Um caminho direto seria selecionar apenas a primeira linha, soltar caracteres que não são witespace e conta quantos caracteres são esquerda:
head -n 1 | tr -cd ' \t' | wc -c
Como posso verificar quantos espaços em branco ('', \t
) existem na primeira linha de um arquivo?
awk '{print gsub("[ \t]",""); exit}' < file
Ou para contar qualquer espaço em branco (caracteres de espaçamento horizontal), não apenas espaço e tabulação:
awk '{print gsub("[[:blank:]]",""); exit}' < file
Você pode usar o GNU sed para substituir a combinação head|tr
(aqui assumindo que POSIXLY_CORRECT não está no ambiente):
sed '1s/[^ \t]//g' |wc -c
Observação: o sed sempre imprimirá uma nova linha, então a contagem incluirá a nova linha em si. Como isso funciona : No sed, você pode dar ao comando s///
um intervalo de endereços, que aqui é apenas a primeira linha. Substitua globalmente qualquer espaço não nulo por nul e envie o resultado para wc
, o que conta os caracteres.
É possível, mas feio, descobrir uma versão pura que faz a contagem.
Uma versão perl também é simples:
perl -lne 's/[^ \t]//g;print length($_);last'
O princípio é o mesmo. A opção -l
gera uma nova linha à direita. A opção -n
envolve o script em um loop gigante de readline. E last
termina esse loop.
A solução awk
do Stéphane me lembrou que você pode fazer isso também com o perl:
perl -lne 'print s/[[:space:]]]//g;last'
Ou substitua-o por [[:blank:]]
para incluir a nova linha e outros caracteres não imprimíveis.
perl -nE '$n = tr/ / /; say $n; exit' file
(funciona com a maioria dos shells) :
IFS=; <file \
read -r IFS # read 1 line into $IFS
set -- $IFS # split while eliding $IFS whitespace
echo "$((${#IFS}-$#))" # $IFS len less $IFS field count
Tags bash wc scripting shell-script