Я пытаюсь создать эффективный скрипт для чтения (большого) блока файлов для каждого блока и сохранить первую строку последнего блока чтения в файле. В моем случае это очень полезно, если я хочу передать файл в программу. Я могу остановить его и запустить его позже в той же строке, на которой он был остановлен раньше (что означает ту же строку блока).Чтение файла, блока за блок
Вот сценарий:
LINE_FILE=line-file
READ_FILE=the_file
BLOCK=1000
LN_SUP=$(cat $LINE_FILE)
####
trap "save_line ; exit" SIGHUP SIGINT SIGTERM SIGKILL
save_line()
{
echo $LN_SUP > $LINE_FILE
}
block_cat()
{
TEXT=$(tail -n+$LN_SUP $READ_FILE | head -n $BLOCK)
echo "$TEXT"
if [ -n "$TEXT" ]; then
return 0
else
return -1
fi
}
test()
{
return 1
}
file_cat()
{
>&2 echo "First line to read the file : $LN_SUP"
block_cat $READ_FILE
while [ $? -eq 0 ]; do
LN_SUP=$(($LN_SUP + $BLOCK)) #Remember the new first line of the block
block_cat $READ_FILE
done
}
Это на самом деле работает, но не так быстро, как я ожидал.
Используется для вывода выходного сигнала на воздушный фильтр, и я теряю почти 18% эффективности.
Как вы думаете, есть ли лучший способ сделать это?
Не открывать файл и многократно искать через него, вероятно, поможет. К сожалению, делать это в bash не совсем возможно, если вы не хотите читать последовательно с самого начала. –