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?

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top