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 02/05/2011, 13h46   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 4
Points : 2
Points : 2
Par défaut [Shell/Awk] Création de fichiers à partir d'un champ

Bonjour à tous,

J'ai plusieurs fichiers (environ 15) qui contiennent tous des lignes de ce type: NOM| PRENOM|AGE|SEXE|TELEPHONE|VILLE

ce que je voudrai c'est que à partir de tous ces fichiers j'en crée des nouveaux (1 fichier par AGE) contenant uniquement le NOM| PRENOM.

Ex:
TITI|TOTO|15|M||PARIS (contenu dans un fichier PARIS.txt)
TITI2|TOTO2|17|M||Lyon(contenu dans un fichier Lyon.txt)
TITI3|TOTO3|18|M||PARIS (contenu dans un fichier PARIS.txt)
TITI4|TOTO|15|M||Lille(contenu dans un fichier Lille.txt)

Ainsi je souhaite avoir
1 fichier : 15Ans.txt contenant :
TITI|TOTO
TITI4|TOTO
1 fichier : 17Ans.txt contenant :
TITI2|TOTO2
1 fichier : 18Ans.txt contenant :
TITI3|TOTO3


Est ce que selon vous c'est possible ?

Thomas
thomas59000 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/05/2011, 14h03   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Code :
awk -F'|' 'BEGIN {OFS="|"}{ print $1,$2 >> $3"Ans.txt" }'  fichiers*
Devrait le faire...
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 50
Vieux 02/05/2011, 14h08   #3
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Salut,

en sed/awk, je ne sais pas, mais en perl, ça se fait bien :

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
25
26
27
28
$ ll
total 12
-rw-r--r-- 1 senga users 23 May  2 14:01 Lille.txt
-rw-r--r-- 1 senga users 23 May  2 14:01 Lyon.txt
-rw-r--r-- 1 senga users 46 May  2 14:01 PARIS.txt
$ cat Lille.txt
TITI4|TOTO|15|M||Lille
$ cat Lyon.txt
TITI2|TOTO2|17|M||Lyon
$ cat PARIS.txt
TITI|TOTO|15|M||PARIS
TITI3|TOTO3|18|M||PARIS
$ perl -n -e '($nom, $prenom, $age) = split(/\|/); open $fic, ">>", $age."Ans.txt"; print $fic "$nom|$prenom\n"; close $fic;' *.txt
$ ll
total 24
-rw-r--r-- 1 senga users 21 May  2 14:07 15Ans.txt
-rw-r--r-- 1 senga users 12 May  2 14:07 17Ans.txt
-rw-r--r-- 1 senga users 12 May  2 14:07 18Ans.txt
-rw-r--r-- 1 senga users 23 May  2 14:01 Lille.txt
-rw-r--r-- 1 senga users 23 May  2 14:01 Lyon.txt
-rw-r--r-- 1 senga users 46 May  2 14:01 PARIS.txt
$ cat 15Ans.txt
TITI4|TOTO
TITI|TOTO
$ cat 17Ans.txt
TITI2|TOTO2
$ cat 18Ans.txt
TITI3|TOTO3
Edit: tiens, je viens donc de découvrir qu'on pouvait parfaitement utiliser print ... >> ... dans awk, on en apprend tous les jours
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 02/05/2011, 14h23   #4
Invité de passage
 
Inscription : janvier 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 4
Points : 2
Points : 2
Citation:
Envoyé par zipe31 Voir le message
Salut,

Code :
awk -F'|' 'BEGIN {OFS="|"}{ print $1,$2 >> $3"Ans.txt" }'  fichiers*
Devrait le faire...
Merci beaucoup ça fonctionne par contre j'ai des doublons dans mes fichiers générés . Est-il possible de n'ajouter que ceux qui n'existe pas encore dans le fichier généré.

Exemple:

TITI4|TOTO|15|M||Lille(contenu dans un fichier Lille.txt)
TITI4|TOTO|15|M||Lille(contenu dans un fichier Lille.txt)
TITI4|TOTO|15|M||Lille(contenu dans un fichier Lille.txt)
TITI5|TOTO5|15|M||Lille(contenu dans un fichier Lille.txt)

Ainsi je souhaite avoir
1 fichier : 15Ans.txt contenant :
TITI4|TOTO
TITI5|TOTO5
thomas59000 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/05/2011, 14h37   #5
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par thomas59000 Voir le message
par contre j'ai des doublons dans mes fichiers générés . Est-il possible de n'ajouter que ceux qui n'existe pas encore dans le fichier généré.
Je suppose que tu ajoute des entrées au fur et à mesure dans ce fichier ?

Peut être serait-il plus approprié d'épurer le fichier par la suite (avec sort)... non ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/05/2011, 14h57   #6
Invité de passage
 
Inscription : janvier 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 4
Points : 2
Points : 2
Effectivement j'ajoute les lignes au fur et à mesure.

Par contre je sais pas trop si trier serait une solution.
Je pense que je vais essayer avec un grep.
thomas59000 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 02/05/2011, 15h08   #7
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par thomas59000 Voir le message
Par contre je sais pas trop si trier serait une solution.
Je pense que je vais essayer avec un grep.
C'est ton choix...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$ cat 15Ans.txt
TITI|TOTO
TITI4|TOTO
TITI|TOTO
TITI4|TOTO

$ sort -u 15Ans.txt
TITI4|TOTO
TITI|TOTO

$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 02/05/2011, 15h28   #8
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par thomas59000 Voir le message
Par contre je sais pas trop si trier serait une solution.
Je pense que je vais essayer avec un grep.
sort ne fait pas que des tris : sort -u permet de virer les doublons notamment

bon, on pourrait le faire en perl aussi, mais je crois que ça n'est pas la peine :p
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 02/05/2011, 16h15   #9
Invité de passage
 
Inscription : janvier 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 4
Points : 2
Points : 2
Ah ok comme ça je peux faire un :

Code :
1
2
3
4
5
6
7
for file in `ls *Ans.txt`
do
   sort -u $file >> TMP$file
   rm $file
   cp $file $file
   rm TMP$file
done
Pour ne pas avoir de doublons ou je peux directement le mettre dans mon awk ?
thomas59000 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 02/05/2011, 16h21   #10
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Il y a peut être moyen de faire ça directement avec "awk" mais comme ce n'est pas mon fort...

Sinon concernant ta boucle :

Code :
1
2
3
4
5
6
7
8
for file in `ls *Ans.txt`
for file in *Ans.txt
do
sort -u ${file} > TMP${file} && mv -f TMP${file} ${file}
rm $file
cp $file $file
rm TMP$file
done
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 02/05/2011, 17h28   #11
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Je conseillerais plutôt de faire un fichier temporaire en sortie de Awk et de faire le sort vers le fichier définitif, ça évite de se prendre la tête

Pour le fun, en perl:
Code perl :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat age.pl
use strict;
use warnings;
 
my $files={};
while (<>) {
        my ($nom, $prenom, $age) = split(/\|/);
        $files->{$age}->{"$nom|$prenom"}=1;
}
foreach my $age (keys %{$files}) {
        open my $fic, '>', $age."Ans.txt";
        foreach my $name (keys %{$files->{$age}}) {
                print $fic "$name\n";
        }
        close $fic;
}
$ perl age.pl *.txt
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 03/05/2011, 16h26   #12
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Aucunement besoin de fichier temporaire avec awk.

Code :
1
2
3
4
5
6
7
8
9
> cat test.t
TITI|TOTO
TITI4|TOTO
TITI|TOTO
TITI4|TOTO
> awk '!a[$0]++ { print > FILENAME }' test.t
> cat test.t
TITI|TOTO
TITI4|TOTO
EDIT : Avec sort non plus d'ailleurs :
Code :
1
2
3
4
5
6
7
8
9
> cat test.t
TITI|TOTO
TITI4|TOTO
TITI|TOTO
TITI4|TOTO
> <test.t sort -uo test.t
> cat test.t
TITI|TOTO
TITI4|TOTO
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 04/05/2011, 13h31   #13
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par FRUiT Voir le message
Aucunement besoin de fichier temporaire avec awk.
...
Intéressant, tu es certain qu'il n'y a aucun risque que awk ou sort ne se mélange les pinceaux avec ce genre de technique ?!

Je n'avais jamais fait gaffe à l'option -o dans sort, mais du coup, est-ce qu'un sort -u test.t -o test.t ne pourrait pas marcher également ?!

Edit: ah ouais, selon ce site, ça marche... cool
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/05/2011, 13h39   #14
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Pour awk, à mon avis tout dépend de la complexité du script appliqué, ce n'est peut-être pas toujours faisable ainsi.

Pour sort, a priori je vois pas de restrictions particulières.

Intéressant ce lien, je garde dans mes tablettes merci ^^
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/05/2011, 12h25   #15
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Je ne sais pas si quelqu'un va lire ceci, mais je suis tombé sur un autre forum sur un sujet ou quelqu'un cherchait à utiliser awk pour modifier un fichier sur lui-même.

Il a utilisé un truc comme cela :
Code :
1
2
3
4
5
6
7
8
9
$ cat > test.t
TITI|TOTO
TITI4|TOTO
TITI|TOTO
TITI4|TOTO
$ { rm test.t && awk '!a[$0]++ { print }' > test.t; } < test.t
$ cat test.t
TITI|TOTO
TITI4|TOTO
L'explication :
Citation:
The content of the input file becomes stdin for rm and awk, rm ignores it and removes the file, but its file descriptor remains open until both commands (rm and awk) complete, so awk process this "nameless" file and creates a new file.
Je vous fais même la traduction pour les anglophobes :
Citation:
Le contenu du fichier en entrée est passé à l'entrée standard de rm et awk, rm l'ignore et supprime le fichier, mais le descripteur de fichier demeure ouvert jusqu'à ce que les 2 commandes (rm et awk) soient terminées, awk peut donc traiter ce fichier "sans nom" (car il a perdu son nom avec la suppression) et créer un nouveau fichier (qui a donc l'ancien nom du fichier supprimé) sans qu'il n'y ait de conflit !
Je trouve ça chouette, je ne sais pas si c'est toujours indispensable, mais j'aime
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/05/2011, 12h41   #16
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Ca me parait quand même un tout petit peu moins élégant que FILENAME, mais c'est intéressant quand même, je note je note ^^
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/05/2011, 14h29   #17
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Moins élégant, ça dépend, mais l'utilisation de la redirection dans awk me fait un peu hésiter perso !

Je trouve que ça ressemble un peu trop à de la redirection shell en terme de présentation, et j'ai peur d'avoir les mêmes problèmes ! Même si je pense que ça n'est pas le cas (comme si tu faisais un sort -u test.t > test.t en fait, ce que tout le monde a fait au début et qui ne marche pas du tout ... alors que { rm test.t && sort -u > test.t; } < test.t passe bien lui... même si l'option -o permet d'éviter le désagrément ).

Bref, j'aime bien la technique
Alek-C 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 +2. Il est actuellement 07h17.


 
 
 
 
Partenaires

Hébergement Web