Uma maneira de fazer isso, assumindo o GNU stat(1)
e o GNU truncate(1)
:
#! /bin/sh
lines=1000000
size=$( wc -l "$1" | awk '{print $1}' )
tail=$(( size % lines ))
count=$(( size / lines ))
if [ $tail -ne 0 ]; then
let count++
fi
while [ $count -gt 0 ]; do
start=$(( (count - 1) * lines + 1 ))
fn=$( printf '%s_%05d' "$1" $count )
sed -n $start,\$p <"$1" >"$fn"
size_last=$( stat -c %s "$fn" )
truncate -s -$size_last "$1"
let count--
done
Sem o GNU coreutils
, a mesma coisa poderia ser feita em Perl.
O arquivo original se perde no processo, portanto, é aconselhável testar primeiro os arquivos acima com alguns arquivos menores, com lines
definido para, digamos, 100.