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 31/12/2010, 10h43   #1
Invité régulier
 
Inscription : décembre 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 20
Points : 9
Points : 9
Par défaut Aide commande awk

Bonjour, je souhaiterais traiter une ligne issue d'un fichier .csv comme suit :

Code :
1
2
# cat fichier.csv
host;adresse_ip;ci_host;champ1;champ2;champ3;champ4;champ5;champ6;champ7;champ8
Le résultat attendu est d'insérer un saut de ligne tous les 3 champs comme suit :

Code :
1
2
3
4
host;adresse_ip;ci_host;
champ1;champ2;champ3;
champ4;champ5;champ6;
champ7;champ8
Si quelqu'un aurait une idée de comment coder ça en shell ?
J'ai pensé à la commande awk mais peut être y a t-il une meilleur solution.

Merci.
arso91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 12h09   #2
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 977
Points : 5 980
Points : 5 980
Salut.

Citation:
Envoyé par arso91 Voir le message
J'ai pensé à la commande awk mais peut être y a t-il une meilleur solution.
Oui tu peut te servir de awk (tu dois aussi pouvoir plus simplement te servir de cut) dans un script shell mais avant d'avoir une solution toute faite, essayes de le faire par toi même et montre nous ce que tu as fait .

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 09h52   #3
Invité régulier
 
Inscription : décembre 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 20
Points : 9
Points : 9
Voici une méthode (enfin !!) pour mon problème :

Citation:
cat fichier.csv | awk '{c=split($0,arr,";"); for(n=1; n<=c; ++n) print arr[n]}'| awk 'ORS=NR%3?",":"\n"' | sed '$s/.$//'
arso91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 10h03   #4
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 977
Points : 5 980
Points : 5 980
Bonjour.

Une autre solution (surement pas la plus simple) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
 
#fichier
FICHIER=fichier.csv
 
# nombre d'élément
SIZE=$(cat $FICHIER | awk 'BEGIN{FS=";"} {print NF}')
 
j=1
for (( i=1 ; i<=$SIZE ; i=$i+1 ))
do
      elem=$(cat $FICHIER | awk 'BEGIN{FS=";"} {print $('$i')}')
      let j=$j+1
 
      printf "$elem;"
 
      if [ $j -eq 4 ]
      then
         j=1
         echo ""
      fi
done
 
echo ""
Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 10h41   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 065
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 065
Points : 4 137
Points : 4 137
Bonjour,

Code :
1
2
3
4
5
6
7
8
#!/usr/bin/gawk -f
 
n=split($0,Array,";"){
   for(i=1; i<=n; i++){
      (i%3 && n-i) ? fmt="%s;" : fmt="%s\n"
      printf(fmt,Array[i])
   }
}
ou
Code :
1
2
3
4
5
6
7
8
#!/bin/bash
 
while IFS=';' read -a Array
do for ((i=1; i<=${#Array[@]}; i++))
   do ((i%3 && ${#Array[@]}-i)) && fmt="%s;" || fmt="%s\n"
      printf "$fmt" "${Array[i-1]}"
   done
done < fichier.csv
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h02.


 
 
 
 
Partenaires

Hébergement Web