Come posso dividere un file di testo in 70% e 30% usando il comando dividi?
Come posso dividere un file di testo in 70% e 30% usando il comando dividi?
Risposte:
I comandi seguenti funzionano con percentuali superiori al 50% (se si desidera dividere solo in due file), approccio rapido e sporco.
1) dividere il 70% in base alle linee
split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename
2) dividere il 70% in base ai byte
split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Puoi usare csplit
per dividere in due pezzi (usando qualsiasi percentuale) ad esempio primo pezzo - primo 20% di linee, secondo pezzo - il restante 80% di linee:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile)
: numero totale di righe
2 / 10
: percentuale
+1
: aggiungi una riga perché si csplit
divideup to but not including line N
Tuttavia, puoi dividere solo in base alle linee.
Fondamentalmente, fintanto che hai il numero di linea tramite $(( $(wc -l < file) * 2 / 10))
puoi usare qualsiasi strumento orientato alla linea:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
o anche più fresco:
{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile
anche se alcuni head
sono stupidi e non conformi agli standard, quindi non funzionerà su tutte le configurazioni ...
{ BS=$(($(wc -c <file) * $P / 100))
dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null
... dovrebbe funzionare per questo semplice caso perché ti dividi solo una volta - e quindi probabilmente split
è un po 'eccessivo. Fino a quando il file è ricercabile, dd
servirà solo a fare una sola read()
su <stdin
, e così cat
è lasciato per iniziare la sua read()
in qualsiasi punto dd
lascia.
Se il file è grande, allora count=1 bs=$big_ol_num
potrebbe diventare un po 'ingombrante e può essere bloccato con un po' di matematica in più - ma semplice - shell.
Un ingresso non seekable - come da un tubo - potrebbe inclinare dd
's risultati, anche se questo può essere gestito così w / GNU dd
' s iflag=fullblock
.
Il seguente codice utilizza head
e tail
funziona con qualsiasi rapporto (da 40 a 60 in questo 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