Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 01/03/2010, 23h49   #1
Invité de passage
 
Inscription : mars 2010
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 2
Points : 0
Points : 0
Par défaut Script shell boucle affichage

Bonjour à tous,
J'ai un petit souci que je n'arrive pas à régler avec mon script shell.
Je possède un fichier qui contient 10 lignes, chaque ligne possède un grand nombre de champs. Pour simplifier.

Fichier toto.txt :
______________________
|a1 a2 a3 a4 a5 .….... an |
|b1 b2 b3 b4 b5 ……....bn |
|c1 c2 c3 c4 c5 …....…cn |
|………………………………….....|
|j1 j2 j3 j4 j5 …….……....jn|
|_____________________|

Mon but est ainsi de concaténer les numéros de champs des dix lignes pour avoir en sortie dans un nouveau fichier :

Fichier but.txt
__________________________
|a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 |
|a2 b2 c2 d2 e2 f2 g2 h2 i2 j2 |
|a3 b3 c3 d3 e3 f3 g3 h3 i3 j3 |
|…………………………………………..…|
|an bn cn dn en fn gn hn in jn |
|_________________________|

J’arrive à le faire avec une méthode actuelle.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
 
# affiche les premiers éléments de chaque ligne a la suite
 a1=`awk '{ print $1 }' /home/toto.txt`;
echo –e “\n” $a1 “\n”;
 
#résultats : a1 b1 c1 d1 e1 f1 g1 h1 i1 j1
 
# affiche les seconds éléments de chaque ligne a la suite
  a2=`awk '{ print $2 }' /home/toto.txt`;
  echo –e “\n” $a2 “\n”;
 
#résultats : a2 b2 c2 d2 e2 f2 g2 h2 i2 j2
Itérer la chose avec un très grand nombre de lignes, cela devient vite inapproprié..

J’aimerai faire une boucle qui permet directement afficher les éléments comme mon fichier but.txt le montre. Si vous pouviez me donner un coup de pouce s’il vous plait.. J’ai bien abordé le problème avec des for et des while mais l’affichage n’était pas correct.

Par exemple :

Code :
1
2
3
4
for ((i=0;i<=NF;i++))
do 
echo –e “$(awk '{ print $i }' /home/toto.txt)”;
done > but.txt
Ce fut sans succès..

Merci d'avance

Dernière modification par lavazavio ; 02/03/2010 à 10h43. Motif: Ajout balises CODE
ciou63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2010, 04h49   #2
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
en Bash ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
 
echo -e "cuu1\nel" | tput -S
echo -e "Tableau original :\n$(<transposTableau.txt)\n\nTableau transposé:"
 
# dans un sens...
ligne=0
while read line
do col=0
   for item in $line
   do eval arr${col}[$ligne]="$item"
      ((col++))
   done
  ((ligne++))
done < transposTableau.txt
 
# puis dans l'autre :)
for ((c=0; c<=col; c++)); do
   for ((l=0; l<=ligne; l++)); do eval echo -n "\${arr${c}[l]}\ "; done
   echo
done | tee but.txt
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Tableau original :
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
b1 b2 b3 b4 b5 b6 b7 b8 b9 b10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10
d1 d2 d3 d4 d5 d6 d7 d8 d9 d10
e1 e2 e3 e4 e5 e6 e7 e8 e9 e10
f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
g1 g2 g3 g4 g5 g6 g7 g8 g9 g10
h1 h2 h3 h4 h5 h6 h7 h8 h9 h10
i1 i2 i3 i4 i5 i6 i7 i8 i9 i10
 
Tableau transposé:
a1 b1 c1 d1 e1 f1 g1 h1 i1 
a2 b2 c2 d2 e2 f2 g2 h2 i2 
a3 b3 c3 d3 e3 f3 g3 h3 i3 
a4 b4 c4 d4 e4 f4 g4 h4 i4 
a5 b5 c5 d5 e5 f5 g5 h5 i5 
a6 b6 c6 d6 e6 f6 g6 h6 i6 
a7 b7 c7 d7 e7 f7 g7 h7 i7 
a8 b8 c8 d8 e8 f8 g8 h8 i8 
a9 b9 c9 d9 e9 f9 g9 h9 i9 
a10 b10 c10 d10 e10 f10 g10 h10 i10
pour un tableau de 70x70, en désactivant les affichages, j'ai un real autour de 2s.
Un script 100% awk fera mieux !

Dernière modification par N_BaH ; 02/03/2010 à 09h30.
N_BaH est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2010, 09h47   #3
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Ce qui me préoccupe ici est que si le fichier est volumineux, il risque très rapidement de saturer la mémoire si on veut le faire en une seule fois. Je propose donc une solution qui acceptera des tableaux de dimensions quelconque, pas obligatoirement carrés, et qui n'utilisera quasiment aucune mémoire:
Code :
1
2
3
4
5
#!/bin/bash
 
awk '{for (i=1; i <= NF; i++) {printf "%s ", $i >> i ".transpose"}}' $1
awk '{sub(" $", ""); print}' $(ls -1 *.transpose | sort -n) > final
rm -f *.transpose
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2010, 11h17   #4
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Ciou63, si je corrige ta solution, qui est pas mal elle aussi, ça donne (en bleu les modifs):

Code :
1
2
3
4
5
6
7
rm -f but.txt
size=$(awk '{if (max < NF) {max=NF}} END {print max}' toto.txt)

for ((i=1; i <= $size; i++))
do
  echo $(awk -v i=$i '{print $i}' toto.txt) >> but.txt
done
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2010, 14h30   #5
Invité de passage
 
Inscription : mars 2010
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 2
Points : 0
Points : 0
Par défaut Script shell boucle affichage

Merci à vous N_BaH et jmelyn pour vos réponses. Elles sont très interressantes. J'ai choisis la simplicité avec la boucle du troisième poste.
J'ai maintenant compris pourquoi ma boucle ne marchait pas..

Autant dire un grand merci à vous!
ciou63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 23h21.


 
 
 
 
Partenaires

Hébergement Web