¿Cómo puedo dividir un archivo de texto en 70% y 30% usando el comando dividir?
¿Cómo puedo dividir un archivo de texto en 70% y 30% usando el comando dividir?
Respuestas:
Los comandos a continuación funcionarán para porcentajes superiores al 50% (si desea dividir solo en dos archivos), enfoque rápido y sucio.
1) dividir 70% basado en líneas
split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename
2) dividir 70% basado en bytes
split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Puede usar csplit
para dividir en dos partes (usando cualquier porcentaje), por ejemplo, la primera pieza - primer 20% de líneas, segunda pieza - el 80% restante de líneas:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile)
: número total de líneas
2 / 10
: porcentaje
+1
: agrega una línea porque se csplit
divideup to but not including line N
Sin embargo, solo se puede dividir según las líneas.
Básicamente, siempre que tenga el número de línea a través $(( $(wc -l < file) * 2 / 10))
, puede usar cualquier herramienta orientada a la línea:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
o, incluso más fresco:
{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile
aunque algunos head
s son tontos y no cumplen con los estándares, por lo que esto no funcionará en todas las configuraciones ...
{ BS=$(($(wc -c <file) * $P / 100))
dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null
... debería funcionar para este caso simple porque solo se está dividiendo una vez, por lo que probablemente split
sea un poco exagerado. En tanto que el archivo es reubicable, dd
sólo se va a hacer un solo read()
sobre <stdin
, y así cat
se deja a iniciar su read()
en cualquier punto dd
de salir.
Si el archivo es grande, a count=1 bs=$big_ol_num
podría ser un poco difícil de manejar, y puede bloquearse con algunas matemáticas de shell adicionales, pero simples.
Una entrada no seekable - como de un tubo - podrían sesgar dd
'Resultados s, aunque esto puede ser manejado como bien w / GNU dd
' s iflag=fullblock
.
El siguiente código usa head
y tail
funciona con cualquier relación (40 a 60 en este 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