Supposons que je dispose d’un fichier texte de 10 Mo foo.txt
et de 100 000 lignes. Maintenant, je veux traiter foo.txt
fenêtre par fenêtre, avec une taille de fenêtre de 10.
Mon script actuel est comme ça:
for ((i=0;i<$lines;i=i+$step))
do
head -$((i+step)) $1 | tail -$step > tmp1
head -$((i+step)) $2 | tail -$step > tmp2
setstr=$setstr' '`./accuracy.sh tmp1 tmp2`
done
echo $setstr | awk '{for (i=1;i<=NF;i++) sum+=$i; }END{print sum/NF}'
Mais ça coule lentement. Existe-t-il un moyen simple et plus efficace de procéder?
rm output_file_prefix_*
?rm
signalerait des erreurs dues à la grande quantité de fichiers. Et même si nous contournons cela, la suppression prend encore beaucoup de temps.Il serait utile d’avoir un peu plus de contexte quant à votre objectif ultime plutôt qu’un extrait de code. En particulier, avez-vous un contrôle sur la précision.sh?
Quoi qu’il en soit, si vous voulez continuer à utiliser bash, vous pouvez le faire.
la source
Vous ne savez pas pourquoi cela a migré de StackOverflow. Bien que ce
split
soit une réponse de style superutilisateur , la question portait sur la programmation. Par exemple, voici une réponse qui implémente ce que vous recherchezawk
.L'un des aspects les plus pratiques de
awk
la façon dont il traite les tuyaux.Votre
cmd
sera ré-ouvert s'il est fermé ... et se ferme toutes les 10 lignes, pour être rouvert la prochaine ligne de sortie.L'effet sera d'exécuter
handler
toutes les 10 lignes d'entrée. À la fin du fichier,handler
sera exécuté avec toutes les lignes restantes, comme celacmd
se ferme automatiquement à la sortie de awk.Strictement parlant, vous n’avez pas besoin d’utiliser une variable comme celle
cmd
de stocker la commande ... mais cela simplifie le réglage de la commande, car vous auriez sinon besoin de regarder TRÈS attentivement les fautes de frappe dans votreclose()
.la source
Cette solution n'utilise aucun fichier temporaire. Ce qui est fait est de stocker chaque ligne dans un tableau de mémoire tampon pouvant contenir dix lignes. Chaque fois que le numéro de ligne est divisible par dix, toutes les lignes du tampon sont imprimées.
Le piège évident est lorsque le fichier d'entrée (# lignes) n'est pas divisible par dix. La solution consiste à effectuer des vérifications dans une clause END {}. Quelque chose comme:
L'idée est d'utiliser des blocs d'impression awk de dix lignes et de les traiter, ou de les traiter directement avec awk si l'opération est une simple opération arithmétique ou chaîne.
la source