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
Répondre
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-
?
Ne pas faire ses devoirs, juste tester le site. Merci pour votre réponse. – Sklivvz
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
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.
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)
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