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 03/03/2011, 17h54   #1
Rédacteur/Modérateur
 
Inscription : juin 2003
Messages : 4 176
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 176
Points : 4 280
Points : 4 280
Par défaut awk commande problème

Bonjour,

j’espère que je suis dans le bon forum..j'ai un problème avec une requête qui doit compter le nombre de (|) dans un fichier pour chaque ligne..
et s'il en manque, compeleter jusqu'à 47.

voilà la commande:

Code :
cat source_file |  awk -F"|" 'NF < 47 {var=""; for (i=0;i<(47-NF);i++) var=var"|";echo $0var;  print $0var;} NF == 47 {print $0;}' >  dest_file
mais pour un fichier ça me supprime tout, le fichier résultat est vide..

je ne sais pas comment débugger ..pour bien voir où est le problème ..

Merci
__________________
Articles: Richfaces - JBosstools pour JSF.
Sniper37 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/03/2011, 20h48   #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 978
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 978
Points : 6 020
Points : 6 020
Bonsoir.

Quelque chose dans ce style conviendrait ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
 
source_file=fichier.txt
tmp=fichier2.txt
 
cat $source_file | while read ligne
do
	nb=$(echo $ligne | awk 'BEGIN{FS="|"} {print NF}')
 
	ligne2=$ligne
 
	if [ $nb -lt 47 ]
	then
		for (( i=nb ; i<47 ; i=$i+1 ))
		do
			ligne2="$ligne2|"
		done
	fi 
 
	echo $ligne2 >> $tmp
done
rm $source_file
mv $tmp $source_file
N.B : il y a surement plus simple

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/03/2011, 21h37   #3
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

Code script.awk :
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/awk -f
 
BEGIN{FS="|"}
{
   if( NF < 47 ){
      for (i=0; i<(47 - NF); i++) var=var"|"
   }
   print $0""var
   var=""
}
puis, après un chmod adéquat
Code :
1
2
./script.awk Source > Destination
mv Destination Source
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 04/03/2011, 08h37   #4
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
utiliser cat .... | awk .....
c'est pas nécessaire pour ce genre de manipulation

Code :
awk .......... fichiersAtraiter > fichierResultant
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/03/2011, 10h22   #5
Rédacteur/Modérateur
 
Inscription : juin 2003
Messages : 4 176
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 176
Points : 4 280
Points : 4 280
Bonjour,

J'ai essayé le script de N_bah,
je n'arrive pas à l’exécuter erreur :

Code :
./script.awk: Not a directory
__________________
Articles: Richfaces - JBosstools pour JSF.
Sniper37 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 04/03/2011, 10h33   #6
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 978
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 978
Points : 6 020
Points : 6 020
Pouvez-vous nous retourner le résultat de la commande ci-dessous, dans le répertoire ou vous avez essayé d’exécuter le script ?

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/03/2011, 10h39   #7
Rédacteur/Modérateur
 
Inscription : juin 2003
Messages : 4 176
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 176
Points : 4 280
Points : 4 280
vide ..
__________________
Articles: Richfaces - JBosstools pour JSF.
Sniper37 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/03/2011, 11h05   #8
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 978
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 978
Points : 6 020
Points : 6 020
Tu n'es surement pas dans le bon répertoire alors.
Il faut faire ./mon_script quand on est dans le répertoire ou se situe le script.

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/03/2011, 11h08   #9
Rédacteur/Modérateur
 
Inscription : juin 2003
Messages : 4 176
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 176
Points : 4 280
Points : 4 280
Code :
1
2
3
4
5
6
7
8
>ls *.sh
 
script.sh
 
 
>./script.sh
 
./script.sh: Not a directory
__________________
Articles: Richfaces - JBosstools pour JSF.
Sniper37 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/03/2011, 11h13   #10
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 978
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 978
Points : 6 020
Points : 6 020
Et ls -l pour voir les droits ?

S'il n'y a pas les droits d'exécution, il faut faire un :

Code :
chmod +x script.sh # ou script.awk pour celui de N_Bah
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/03/2011, 11h17   #11
Rédacteur/Modérateur
 
Inscription : juin 2003
Messages : 4 176
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 176
Points : 4 280
Points : 4 280
-rwxrwxrwx .


peu être j'ai une ancienne version de awk, le readLine fonctionnait pas.
__________________
Articles: Richfaces - JBosstools pour JSF.
Sniper37 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/03/2011, 11h47   #12
Rédacteur/Modérateur
 
Inscription : juin 2003
Messages : 4 176
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 176
Points : 4 280
Points : 4 280
re..bonjour,

Au fait, je reformule ma question autrement,
je voudrais supprimer du fichier résultat toutes les colonnes et séparateurs si ça dépasse 47, ma première commande complète le fichier s'il le nombre de colonnes est inférieur à 47.
__________________
Articles: Richfaces - JBosstools pour JSF.
Sniper37 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/03/2011, 12h07   #13
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
on continue :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/awk -f

BEGIN{ FS="|" }
{
   if( NF < 47 ){
      for (i=0; i<(47 - NF); i++) var=var"|"
      print $0""var
      var=""
   } else
   if(NF>47){
      for(x=1; x<=47; x++){
         if(! var) {var = $x} else {var = var"|"$x }
      }
      print var
      var=""
   } else { print $0 }
}
~
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/03/2011, 14h56   #14
Rédacteur/Modérateur
 
Inscription : juin 2003
Messages : 4 176
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 176
Points : 4 280
Points : 4 280
Pourquoi le test

ça me donne l'erreur: Event not found

Je le f ais directement en ligne de commande sans passer par un script:

le fichier source contient 35 lignes..avec un NF 48.

Code :
cat source | awk -F"|" 'NF>47 { var=$0; for (i=1;i<=47;i++)  var=var"|"$i ; print var; var=""; }' > tmp
le fichier tmp a un NF = 95..
__________________
Articles: Richfaces - JBosstools pour JSF.
Sniper37 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h54   #15
Rédacteur/Modérateur
 
Inscription : juin 2003
Messages : 4 176
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 176
Points : 4 280
Points : 4 280
si j'ai bien compris..

$0 ça affiche toute la ligne. .

donc je commence par $1..

Code :
cat source | awk -F"|" 'NF<47 {var="";  for (i=0;i<47-NF;i++) var=var"|"; print $0var;} NF>47   { var=$1; for (i=2;i<=47;i++)  var=var"|"$i ; print var; } NF == 47 {print $0;}' > dest

ça l'air de fonctionner ..


Je teste encore toutes les possibilités.

Merci
__________________
Articles: Richfaces - JBosstools pour JSF.
Sniper37 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h36.


 
 
 
 
Partenaires

Hébergement Web