bonjour, merci d'avance pour votre aide ,
je cherche a trier, avec un script en bash, un fichier dont chaque ligne commence par un nombre de 0 à 600 puis une tabulation suivi du restant de la ligne , je souhaiterai le trier en autant de fichier que de nombre différent qui commence chaque ligne.
voici mon ébauche de débutant :
set nb_temp 600
while [$nb_temp]
do
cat resultat.txt | awk -F" " ' $1 ~/^""%3d" ",$nb_temp / {print $0}' >> temp
set nom `"resultat."%s".txt",$nb_temp`
cat temp >> $nom
rm -f temp
nb_temp+= -1
done
Le probleme de cette méthode est que, si elle fonctionnait deja, la boucle lirai 600 fois mon fichier qui fait plusieurs Mega et parai donc obsolète pour ne pas employer de termes grossier.
J'ai une piste sur les scripts awk mais cela reste vague pour le debutant que je suis . Merci d'avance.
# sort
Posté par Calim' Héros (site web personnel) . Évalué à 3.
# man sort
Posté par dguihal . Évalué à 2.
devrait faire l'affaire
P.S. : remplacer par l'appui sur la touche TAB
[^] # Re: man sort
Posté par dguihal . Évalué à 3.
un :
devrait faire l'affaire
P.S. : remplacer < TAB > par l'appui sur la touche TAB
# vive awk!
Posté par didit . Évalué à 2.
grep $i $1 > resultat.$i.txt
done
Sans aucune garantie. Non testé.
Ca doit être un peu mieux que ce que tu as proposé mais le fichier sera lu encore pas mal de fois.
Pour faire mieux, il y a ça qui lit le fichier une seule fois:
awk '{print >> $1}' mon_gros_fichier
Voir http://www.gnu.org/software/gawk/manual/gawk.html section "4.6 Redirecting Output of print and printf" pour les détails.
[^] # Re: vive awk!
Posté par marceau . Évalué à 1.
Et si je veux recup la ligne entière et non que les champs $1, je fais un
grep $i $0 > resultat.$i.txt ?????
Merci pour l'info , je bosse la dessus.
[^] # Re: vive awk!
Posté par didit . Évalué à 1.
La première solution est un script. Il faut mettre ces trois lignes dans un fichier texte, le rendre exécutable et exécuter ce script avec en argument le nom du fichier à traiter. Alternativement, on peut tout mettre sur une ligne de commande mais il faut alors remplacer $1 par le nom de fichier à traiter, sauf dans awk '{print $1}'. Ca donne ça:
for i in `awk '{print $1}' mon_gros_fichier | sort -n | uniq`; do grep $i mon_gros_fichier > resultat.$i.txt; done
La commande grep $i $1 > resultat.$i.txt dans ce script recherche la chaîne $i dans le fichier $1 (l'argument du script), lorsque cette chaîne est trouvée, toute la ligne est affichée et le caractère > redirige la sortie vers un fichier.
# A la place de man sort, je ferai un man awk
Posté par pi6Lohe . Évalué à 3.
002 azerty
001 poiuyt" | awk '{ out = "result_" $1 ".txt" ; print $0 >> out}'
print peut être redirigé (section Output Statements)
[^] # Re: A la place de man sort, je ferai un man awk
Posté par pi6Lohe . Évalué à 1.
[^] # Re: A la place de man sort, je ferai un man awk
Posté par marceau . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.