Você pode usar csplit
para dividir em duas partes (usando qualquer porcentagem), por exemplo, primeira peça - primeiros 20% das linhas, segunda peça - os restantes 80% das linhas:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile)
: número total de linhas em 2 / 10
: porcentagem em% +1
: adicionar uma linha porque csplit
divide up to but not including line N
Você só pode dividir com base em linhas embora.
Basicamente, contanto que você tenha o número da linha via $(( $(wc -l < file) * 2 / 10))
, você pode usar qualquer ferramenta orientada a linhas:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
ou, ainda mais legal:
{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile
embora alguns head
s sejam burros e não cumpram os padrões então isso não funcionará em todas as configurações ...