Como posso dividir um arquivo de texto em 70% e 30% usando o comando split?
Como posso dividir um arquivo de texto em 70% e 30% usando o comando split?
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
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
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:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile)
: número total de linhas
2 / 10
: porcentagem
+1
: adicione uma linha porque csplit
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:
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
sejam idiotas e não cumpram os padrões , isso não funcionará em todas as configurações ...
{ BS=$(($(wc -c <file) * $P / 100))
dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null
... 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 única read()
on <stdin
, e assim cat
é deixado para começar a sua read()
em qualquer ponto dd
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 / GNU dd
' s iflag=fullblock
.
O código a seguir usa head
e tail
funciona com qualquer proporção (40 a 60 nesse 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