Você pode obter uma lista de todos os números de linha, um por linha ordenada primeiro por comprimento e segundo por número de linha, começando por w / o maior como ...
</path/to/infile LC_ALL=C \
tr -c \n 1|grep -n '.\|'|sort -t: -rnk2
O método é muito simples - tr
converte cada byte de entrada que não é um caractere de \n
ewline para 1, grep -n
preenche o número de cada linha e então :
para todas as linhas em sua entrada, que sort
, em seguida, ordena a ordem numérica inversa do campo 2cd até a parte final da linha, delimitada por :
. Assim, a sequência mais longa de 1s flutua até o topo.
Você deve ficar atento, porém, se a entrada incluir caracteres multibyte, então isso será numerado apenas por byte - não por caractere. Fazer a última coisa de forma robusta não é um empreendimento menor (pelo que entendi) .
Em qualquer caso - em um local ASCII - o acima deve ser muito rápido mesmo para entradas muito grandes. E requer muito pouco mais para ser uma solução completa:
f=/path/to/file
n=$(<"$f" tr -c \n 1|grep -n '.\|'|sort -t: -rnk2|head -n1)
l=$(<"$f" head -n"${n%:*}"|tail -n1)
printf "Line #%s at #${#l} bytes. Its contents:\n%s\n" \
"${n%:*} is (possibly tied-for) the longest in $f" "$l"