Se você estiver disposto a usar um pouco de Python em seu código, é fácil encontrar o tamanho da linha mais curta:
python3 -c 'import sys; print(min(map(len, sys.stdin)))' < "$file"
print
e min
devem ser razoavelmente óbvios. map(len, sys.stdin)
aplica a função len
(length) a cada entrada em sys.stdin
, que é cada linha na entrada padrão. Como isso conta a nova linha no comprimento de uma linha, seu comprimento mínimo será 1 a mais do que você espera. Para corrigir isso:
python3 -c 'import sys; print(min(map(len, sys.stdin.read().splitlines())))' < "$file"
Caso contrário, uma combinação de awk
, sort
e head
:
awk '{print length}' "$file" | sort | head -1
head -1
imprime apenas a primeira entrada, que, após a classificação, seria o comprimento de linha mais curto. Ou, inteiramente no bash:
{
IFS= read -r line
min=${#line}
while IFS= read -r line
do
length=${#line}
((min > length)) && min=$length
done
} < "$file"
echo "shortest line's length is $min"
Aqui, usei { }
para incluir a seção de código. Dessa forma, < "$file"
se aplica a toda essa seção, de modo que o primeiro read
e o while
de leitura sejam lidos a partir dele.