Trie fichier avec SED ou AWK

Résolu/Fermé
Signaler
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
-
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
-
Bonjour,

voila j'ai un fichier txt qui contient un grand nombre de lignes comme cela:
  n°                 id              th           date
        220_714      |     81760     |    0    | 19/01/2010
       220_2530     |  76788223   |    0    | 05/05/2006
       110_2256      |     81554     |   0    | 19/01/2004
       110_2563      | 101701108  |    0   | 18/10/2006


et je souhaiterais soit en utilisant AWK ou SED avoir en sortie un fichier ayant des lignes d'update avec dans le where l'id de chaque ligne comme ci-dessous :

update table set champ=0 where comp=81760;
update table set champ=0 where comp=76788223;
update table set champ=0 where comp=81554;
update table set champ=0 where comp=101701108;


Une idée?

Merci

12 réponses

Messages postés
2346
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
22 août 2014
299
Tu ouvres ton fichier avec vim et tu tapes :
:%s/^[0-9_]\+[ \t]\+|[ \t]\+\([0-9]\+\) .*/update table set champ=0 where comp=\1;/g
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021
5 442
hello
avec awk
 awk 'BEGIN {FS=OFS="|"} ; /\|/ {$2=sprintf(" update table set champ=0 where comp=%d ",$2)} ; {print $0}' < fichier 
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021
5 442 >
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

non, je modifie le champ 2 des lignes qui contiennent | et j'imprime toutes les lignes
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 890 >
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021

Ben ce n'est pas ce que demande notre ami il me semble ;-\
[rep]$ cat bar
  n°                 id              th           date
        220_714      |     81760     |    0    | 19/01/2010
       220_2530     |  76788223   |    0    | 05/05/2006
       110_2256      |     81554     |   0    | 19/01/2004
       110_2563      | 101701108  |    0   | 18/10/2006

[rep]$ awk 'BEGIN {FS=OFS="|"} ; /\|/ {$2=sprintf(" update table set champ=0 where comp=%d ",$2)} ; {print $0}' < bar
  n°                 id              th           date
        220_714      | update table set champ=0 where comp=81760 |    0    | 19/01/2010
       220_2530     | update table set champ=0 where comp=76788223 |    0    | 05/05/2006
       110_2256      | update table set champ=0 where comp=81554 |   0    | 19/01/2004
       110_2563      | update table set champ=0 where comp=101701108 |    0   | 18/10/2006

[rep]$ awk 'BEGIN {FS=OFS="|"} ; /\|/ {$2=sprintf(" update table set champ=0 where comp=%d ",$2)} ; {print $2}' < bar

 update table set champ=0 where comp=81760
 update table set champ=0 where comp=76788223
 update table set champ=0 where comp=81554
 update table set champ=0 where comp=101701108

[rep]$  
;-))
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021
5 442 >
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

ah peut-être, j'ai compris modifier la colonne id mais garder le reste
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 890 >
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021

Ben au moins comme ça il aura la totale ;-)))
Messages postés
2346
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
22 août 2014
299 >
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

Moi j'avais bon dès le départ! ;)
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
19
Merci a tous pour les différentes façon de faire. Je vais toutes les testées et je reviens vers vous .

Merci encore
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
19
en faites j'ai pas du tout comprendre puisque j'ai fait des essais sur d'autres fichiers mais cela ne fonctionne pas

Le contenu de mon fichier :

n°                 id              th                              dft
        toto     |     81760     |    01 02 03 04 06    | 540_256
       220_2530     | tata   |    02 65 45 25 26    | 654_589
       110_2256      |     81554     |   02 54 68 54 26    | 202_2546
      titi     | tutu  |    06 54 85 98 45   | 100_5648


j'ai fait un

awk 'BEGIN {FS=OFS="|"} ; /\|/ {$2=sprintf(" update table set st=1 where ref  in (select uid from toto where euid='%d') and refari=140340034",$2)} ; {print $2}' <Liste.txt


mais j'ai comme résultat

update table set st=1 where ref in (select uid from toto where euid=0) and refari=140340034
update table set st=1 where ref in (select uid from toto where euid=0) and refari=140340034
update table set st=1 where ref in (select uid from toto where euid=0) and refari=140340034
update table set st=1 where ref in (select uid from toto where euid=0) and refari=140340034


Ou est l'erreur et si je peux avoir quelques explications ce serait chouette?

Merci beaucoup
L'accès au savoir est la première liberté que chaque homme devrait avoir.
Messages postés
2346
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
22 août 2014
299
Tu n'as qu'à appliquer la solution que je t'ai proposé...
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021
5 442
essaye avec euid=%d ou euid=\'%d\' si tu veux afficher '
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
19
J'avais déjà essayé ta méthode Gigaga mais cela ne fonctionnait pas j'avais comme erreur :

motif introuvable %s/^[0-9_]\+[ \t]\+|[ \t]\+\([0-9]\+\)

%s/^[0-9_]\+[ \t]\+|[ \t]\+\([0-9]\+\) /.*update table set st=1 where ref in (select uid from toto where euid=\1) and refari=140340034;/g

Merci
Messages postés
2346
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
22 août 2014
299
ouvre ton fichier avec :
vi <tonfichier>

et dans l'éditeur tapes ce que j'ai écris (en commençant par ":")
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
19
c'est ce que j'ai fait. J 'ai ouvert dans VI mon fichier puis j'ai taper les : et enfin la ligne

%s/^[0-9_]\+[ \t]\+|[ \t]\+\([0-9]\+\) /.*update table set st=1 where ref in (select uid from toto where euid=\1) and refari=140340034;/g


et j'ai l'erreur que j'indique plus haut.

Merci
Messages postés
2346
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
22 août 2014
299
Essaie ça :

%s/^[ \t]*.\+[ \t]\+|[ \t]\+\(.\+\)[ \t]\+|[ \t]\+.*[ \t]\+|.*/update table set st=1 where ref in (select uid from toto where euid=\1) and refari=140340034;/g
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
19
Dubcek,

j'ai essayé ce que tu m'indiques mais cela ne fonctionne pas. en effet si je saisis euid=%d jle resultat ne change pas et si je saisis euid=\'%d\' j'ai l'erreur suivante :

bash: syntax error near unexpected token `)'

Merci
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 890
Re-

A partir de ton exemple du post #10, quel est le résultat escompté ?
Messages postés
2346
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
22 août 2014
299
n°                 id              th                              dft
        toto     |     81760     |    01 02 03 04 06    | 540_256
       220_2530     | tata   |    02 65 45 25 26    | 654_589
       110_2256      |     81554     |   02 54 68 54 26    | 202_2546
      titi     | tutu  |    06 54 85 98 45   | 100_5648



:%s/^[ \t]*\w\+[ \t]\+|[ \t]\+\(\w\+\)[ \t]\+|[ \t]\+.*[ \t]\+|.*/update table set st=1 where ref in (select uid from toto where euid=\1) and refari=140340034;/g


devient:

n°                 id              th                              dft
update table set st=1 where ref in (select uid from toto where euid=81760) and refari=140340034;
update table set st=1 where ref in (select uid from toto where euid=tata) and refari=140340034;
update table set st=1 where ref in (select uid from toto where euid=81554) and refari=140340034;
update table set st=1 where ref in (select uid from toto where euid=tutu) and refari=140340034;
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
19
Merci beaucoup a tous et particulierement a toi Gigaga et milles excuses car je n'ai pas ete clair dans ce que je souhaite. je m'explique donc de nouveau.

je souhaite recuperer la valeur du champ dft de chaque lignes de mon fichier :

n°                 id              th                              dft
 toto       |     81760     |    01 02 03 04 06    | 540_256
 gdtgh     | tata            |    02 65 45 25 26    | 654_589
 jgkgi      |     81554     |   02 54 68 54 26    | 202_2546
 tuotu      | tutu            |    06 54 85 98 45   | 100_5648

afin d'afficher en sortie :

update table set st=1 where ref in (select uid from toto where euid=540_256) and refari=140340034;
update table set st=1 where ref in (select uid from toto where euid=654_589) and refari=140340034;
update table set st=1 where ref in (select uid from toto where euid=202_2546) and refari=140340034;
update table set st=1 where ref in (select uid from toto where euid=100_5648) and refari=140340034;


Voila j'espere que je suis plus clair dans ma demande d'aide et encore pardon pour m'être mal expliquer

Merci
Messages postés
619
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
18 novembre 2021
19
Bon j'ai trouvé , j'ai fait diffèrement :

awk -F '|' '{print "update table set st=1 where ref in (select uid from toto where euid='\''"$4"'\'') and refari=140340053;"}' Liste.txt > sortie.txt


Merci a tous