Question

J'ai un fichier assez volumineux (150 millions de lignes de 10 caractères). Je dois le scinder en 150 fichiers de 2 millions de lignes, chaque ligne de sortie représentant alternativement les 5 premiers caractères ou les 5 derniers caractères de la ligne source. Je pouvais faire cela assez rapidement en Perl, mais je me demandais s’il existait une solution simple avec bash. Des idées?

Était-ce utile?

La solution

Des devoirs? : -)

Je pense qu’un simple tuyau avec sed (pour scinder chaque ligne en deux) et scindé (pour scinder des éléments en plusieurs fichiers) serait suffisant.

La commande man est votre ami.

Ajouté après confirmation que ce n'est pas un devoir:

Que diriez-vous de

sed 's/\(.....\)\(.....\)/\1\n\2/' input_file | split -l 2000000 - out-prefix-

?

Autres conseils

Je pense que quelque chose comme cela pourrait fonctionner:

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

Vous n'êtes pas sûr que ce soit plus simple ou plus efficace que d'utiliser Perl, cependant.

Cinq premiers caractères de chaque variante de ligne, en supposant que le fichier volumineux s'appelle x.txt et en supposant qu'il soit correct de créer des fichiers dans le répertoire en cours avec les noms x.txt. *:

split -l 2000000 x.txt x.txt.out & amp; & amp; (pour splitfile dans x.txt.out *; do outfile = "$ {splitfile} .firstfive"; echo "$ splitfile - > $ outfile"; cut -c 1-5 "$ splitfile" > " ; $ outfile " ;; done)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top