2008-09-15 11 views
1

J'ai un fichier assez volumineux (150 millions de lignes de 10 caractères). J'ai besoin de le diviser en 150 fichiers de 2 millions de lignes, chaque ligne de sortie étant alternativement les 5 premiers caractères ou les 5 derniers caractères de la ligne source. Je pourrais le faire en Perl plutôt rapidement, mais je me demandais s'il y avait une solution facile en utilisant bash. Des idées?Fractionner un fichier et ses lignes sous Linux/bash

+0

Je pense que vous devez être un peu plus clair sur ce que la transformation est exactement. (C'est, je ne comprends pas.) Peut-être un petit exemple? – mweerden

Répondre

3

Travail à domicile? :-)

Je pense qu'un simple tuyau avec sed (pour diviser chaque ligne en deux) et split (pour diviser les choses en plusieurs fichiers) serait suffisant.

La commande man est votre ami.


ajouté après confirmation qu'il n'y a pas de devoirs:

Que diriez-vous

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

?

+0

Ne pas faire ses devoirs, juste tester le site. Merci pour votre réponse. – Sklivvz

+0

Super! À la fin, j'ai utilisé ceci: pour le fichier au format * .txt; fais le fichier $ echo; sed 's/\ (..... \) \ (..... \)/\ 1 \ r \ n \ 2 /' $ fichier | split -l 2000000 - $ fichier.part .; terminé – Sklivvz

0

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 

Je ne sais pas s'il est plus simple ou plus efficace que l'utilisation de Perl, cependant.

0

cinq premiers caractères de chaque variante de ligne, en supposant que le gros fichier appelé x.txt, et à supposer que c'est OK pour créer des fichiers dans le répertoire courant avec des noms x.txt *:.

séparés -l 2.000.000 x .txt x.txt.out & & (pour splitfile dans x.txt.out *; out out = "$ {splitfile} .firstfive"; echo "$ splitfile -> $ outfile"; couper -c 1-5 "$ splitfile ">" $ outfile "; done)

Questions connexes