Split: como dividir em diferentes porcentagens?

13

Como posso dividir um arquivo de texto em 70% e 30% usando o comando split?

    
por aneuryzm 28.03.2011 / 11:16

4 respostas

10

Os comandos abaixo funcionarão para porcentagens acima de 50% (se você quiser dividir apenas dois arquivos), abordagem rápida e suja.

1) dividir 70% com base nas linhas

split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename 

2) dividir 70% com base em bytes

split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename
    
por 28.03.2011 / 12:01
4

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 ...

    
por 21.12.2014 / 19:41
2
{   BS=$(($(wc -c <file) * $P / 100))
    dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null

... deve funcionar para este caso simples porque você está apenas dividindo uma vez - e provavelmente split é um pouco exagerado. Contanto que o arquivo seja pesquisável, dd fará apenas um único read() em <stdin , e então cat é deixado para começar seu read() em qualquer ponto em que dd o deixe.

Se o arquivo for grande, então um count=1 bs=$big_ol_num poderia ficar um pouco pesado, e ele pode ser bloqueado com alguma matemática simples, mas ainda assim simples.

Uma entrada não procurada - como de um pipe - pode distorcer os resultados de dd , embora isso também possa ser tratado com dd do% GNU iflag=fullblock .

    
por 21.12.2014 / 21:39
0

O código a seguir usando head e tail funciona com qualquer proporção (40 a 60, neste caso):

export FILE_NAME=train.vw
head -n $[ $(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100 ] ${FILE_NAME} > train_40.vw
tail -n +$[ ($(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100) + 1 ] ${FILE_NAME} > train_60.vw
    
por 28.03.2018 / 15:22

Tags