Considere este bash versão:
#! /bin/bash
exec 3<test.txt
COUNT=0
while read VALUE
do
if [[ -z $LAST_VAL ]]
then
IN_VAL="$LAST_VAL"
else
LINE="$(head <&3 -1)"
IN_VAL="$(cut -c1-9 <<<'$LINE')"
let COUNT=$COUNT+1
fi
while [[ $IN_VAL < $VALUE ]]
do
LINE="$(head <&3 -1)"
IN_VAL="$(cut -c1-9 <<<'$LINE')"
let COUNT=$COUNT+1
LAST_VAL="$IN_VAL"
[[ -z $IN_VAL ]] && break
done
echo $((COUNT - 1)) $LINE
[[ -z $IN_VAL ]] && break
done
head (e algumas outras ferramentas, como grep com --max-count ), diferente de awk , deixa o fluxo posicionado logo após o último caractere lido, para que você possa continuar usando o mesmo fluxo para pesquisar mais tarde. O problema é quando o valor lido não corresponde, então você precisa salvá-lo para a próxima iteração (como eu fiz em LAST_VAL ). Os valores de COUNT e LINE devem ser o último número de linha e linha correspondentes. Dessa forma, tudo isso pode ser feito em uma única leitura do arquivo.