Suddividere i file e le sue linee sotto Linux/bash
-
09-06-2019 - |
Domanda
Mi ha un po ' di file di grandi dimensioni (150 milioni di righe di 10 caratteri).Ho bisogno di dividere in 150 file di 2 milioni di linee, con ogni linea di uscita di essere, in alternativa, i primi 5 caratteri o gli ultimi 5 caratteri di sorgente di linea.Ho potuto fare questo in Perl, piuttosto velocemente, ma mi chiedevo se c'era una soluzione semplice uso di bash.Tutte le idee?
Soluzione
I compiti a casa?:-)
Vorrei pensare che un semplice tubo con sed (per dividere ogni linea in due) e split (dividere le cose in più file) sarebbe sufficiente.
Il comando " man " è tuo amico.
Aggiunto dopo la conferma che non è compito per casa:
Come circa
sed 's/\(.....\)\(.....\)/\1\n\2/' input_file | split -l 2000000 - out-prefix-
?
Altri suggerimenti
Penso che qualcosa come questo potrebbe funzionare:
out_file=1
out_pairs=0
cat $in_file | while read line; do
if [ $out_pairs -gt 1000000 ]; then
out_file=$(($out_file + 1))
out_pairs=0
fi
echo "${line%?????}" >> out${out_file}
echo "${line#?????}" >> out${out_file}
out_pairs=$(($out_pairs + 1))
done
Non so se è più semplice o più efficace rispetto all'utilizzo di Perl, però.
Primo di cinque caratteri di ogni riga di variante, supponendo che il file di grandi dimensioni chiamato x.txt e supponendo che sia OK per creare i file nella directory corrente, con i nomi di x.txt.* :
split-l 2000000 x.txt x.txt.out && (per splitfile in x.txt.*l';fare outfile="${splitfile}.firstfive";echo "$splitfile -> $outfile";cut-c 1-5 "$splitfile" > "$outfile";fatto)