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.