Você está casado com o uso do comando split? Caso contrário, você pode fazer isso facilmente com a manipulação direta de texto, certamente usando perl ou python. Desde que o arquivo não esteja muito errado, leia-o na memória como uma sequência e divida-a. Se o arquivo for muito grande, será necessário mais trabalho.
Faheem Mitha 28/03
@Faheem Mitha O arquivo tem 64MB. Eu gosto da ideia de usar split, porque é mais rápido que escrever código. Fiquei me perguntando agora, se eu especificar o número de linhas correspondentes a 70% do arquivo, recebo um arquivo grande e um arquivo pequeno. Não deveria funcionar?
No MacOSX, o wc às vezes retorna o número de linhas com um espaço à sua frente, algo que quebra esse script. A primeira tubulação para xargs removerá esses espaços e fará as coisas funcionarem novamente: split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Emil Stenström
4
Você pode csplitdividir em duas partes (usando qualquer porcentagem), por exemplo, primeira peça - primeiros 20% das linhas, segunda peça - os restantes 80% das linhas:
$(wc -l < infile): número total de linhas 2 / 10: porcentagem +1: adicione uma linha porque csplitdivideup to but not including line N
Você só pode dividir com base em linhas.
Basicamente, desde que você tenha o número da linha, $(( $(wc -l < file) * 2 / 10))pode usar qualquer ferramenta orientada a linhas:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
... deve funcionar neste caso simples, porque você está se separando apenas uma vez - e provavelmente splité um pouco exagerado. Enquanto o arquivo é pesquisável, ddsó vai fazer uma única read()on <stdin, e assim caté deixado para começar a sua read()em qualquer ponto dddeixa.
Se o arquivo for grande, um count=1 bs=$big_ol_numpode ficar um pouco pesado e pode ser bloqueado com algumas matemáticas extras - ainda que simples -.
A entrada não-pesquisável - como a partir de um tubo - pode distorcer dd's resultados, embora isso pode ser tratado bem w / GNU dd' s iflag=fullblock.
Respostas:
Os comandos abaixo funcionarão para porcentagens acima de 50% (se você quiser dividir apenas em dois arquivos), abordagem rápida e suja.
1) dividir 70% com base em linhas
2) dividir 70% com base em bytes
fonte
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Você pode
csplit
dividir em duas partes (usando qualquer porcentagem), por exemplo, primeira peça - primeiros 20% das linhas, segunda peça - os restantes 80% das linhas:$(wc -l < infile)
: número total de linhas2 / 10
: porcentagem+1
: adicione uma linha porquecsplit
divideup to but not including line N
Você só pode dividir com base em linhas.
Basicamente, desde que você tenha o número da linha,
$(( $(wc -l < file) * 2 / 10))
pode usar qualquer ferramenta orientada a linhas:ou ainda mais legal:
embora alguns
head
sejam idiotas e não cumpram os padrões , isso não funcionará em todas as configurações ...fonte
... deve funcionar neste caso simples, porque você está se separando apenas uma vez - e provavelmente
split
é um pouco exagerado. Enquanto o arquivo é pesquisável,dd
só vai fazer uma únicaread()
on<stdin
, e assimcat
é deixado para começar a suaread()
em qualquer pontodd
deixa.Se o arquivo for grande, um
count=1 bs=$big_ol_num
pode ficar um pouco pesado e pode ser bloqueado com algumas matemáticas extras - ainda que simples -.A entrada não-pesquisável - como a partir de um tubo - pode distorcer
dd
's resultados, embora isso pode ser tratado bem w / GNUdd
' siflag=fullblock
.fonte
O código a seguir usa
head
etail
funciona com qualquer proporção (40 a 60 nesse caso):fonte