Traitement fichier avec Sed, Awk ou autres

Résolu/Fermé
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - 24 févr. 2016 à 10:02
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - 12 avril 2016 à 14:33
Bonjour,

J'ai un fichier de données qui contient des milliers de lignes comme suite :

1001|20015232851|||25 bld totl||75000|Paris||6|JOEAU|2206000|24/05/2013|25/06/2015||2001|2001|17592|C|48,860274|2,345089
1001|20015246491|||41 rue court||75000|Paris||6|CAENS|289000|28/02/2014|30/07/2015||2001|2001|16141|C|48,88000|2,32417


Celui ci contient 21 champs séparés par des pipes |

J'aurais souhaité pouvoir remplacer les virgules des champs 20 et 21 (les derniers) par des points comme suite :

1001|20015232851|||25 bld totl||75000|Paris||6|JOEAU|2206000|24/05/2013|25/06/2015||2001|2001|17592|C|48.860274|2.345089
1001|20015246491|||41 rue court||75000|Paris||6|CAENS|289000|28/02/2014|30/07/2015||2001|2001|16141|C|48.88000|2.32417


J'ai besoin d' aide.

Merci


A voir également:

4 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
24 févr. 2016 à 11:28
hello
$ awk 'BEGIN {FS=OFS="|"} {sub(",", ".", $20); sub(",", ".", $21); print}' fichier
1001|20015232851|||25 bld totl||75000|Paris||6|JOEAU|2206000|24/05/2013|25/06/2015||2001|2001|17592|C|48.860274|2.345089
1001|20015246491|||41 rue court||75000|Paris||6|CAENS|289000|28/02/2014|30/07/2015||2001|2001|16141|C|48.88000|2.32417
1
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
24 févr. 2016 à 10:39
Bon finalement j'ai trouvé avec Sed.

sed -e 's/|\([0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]\) [0-9][0-9]:[0-9][0-9]:[0-9][0-9]/|\1/g' -e 's/,/./g' fichier1 > fichier2 


Merci
0
mamiemando Messages postés 33076 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 avril 2024 7 748
Modifié par mamiemando le 24/02/2016 à 10:46
Ta solution ne limite pas la substitution aux colonnes 20 et 21. Avec awk :

cat toto.txt | awk 'BEGIN {FS="|"} ; {printf("%s",$1); for(i=2;i<20;i++) printf("|%s",$(i)); for(i=20;i<22;i++){ s=$(i); gsub(/,/, ".", s); printf("|%s",s);} print "";}' 


Ou de manière plus lisible si tu passes par un fichier script.awk :

BEGIN {
  FS="|"
}

{
  printf("%s", $1);
  for (i = 2; i < 20; i++) {
    printf("|%s", $(i));
  }
  for (i = 20; i < 22; i++) {
    s = $(i);
    gsub(/,/, ".", s);
    printf("|%s", s);
  }
  print "";
}


Puis :

cat toto.txt | awk -f script.awk


Exemple :

(mando@velvet) (~) $ cat toto.txt | awk 'BEGIN {FS="|"} ; {printf("%s",$1); for(i=2;i<20;i++) printf("|%s",$(i)); for(i=20;i<22;i++){ s=$(i); gsub(/,/, ".", s); printf("|%s",s);} print "";}' 
1001|20015232851|||25 bld totl||75000|Paris||6|JOEAU|2206000|24/05/2013|25/06/2015||2001|2001|17592|C|48.860274|2.345089
1001|20015246491|||41 rue court||75000|Paris||6|CAENS|289000|28/02/2014|30/07/2015||2001|2001|16141|C|48.88000|2.32417


Bonne chance
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
24 févr. 2016 à 11:31
Salut mamiemando,

On doit pouvoir faire plus court…

awk 'BEGIN {FS=OFS="|"}; { gsub(/,/, ".", $21); gsub(/,/, ".", $22); print }'
0
mamiemando Messages postés 33076 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 avril 2024 7 748
Modifié par mamiemando le 25/02/2016 à 11:04
Merci pour cette remarque très pertinente, car aux index près (
$20
et
$21
au lieu de
$21
et
$22
), c'est effectivement beaucoup plus simple !

awk 'BEGIN {FS = OFS = "|"}; { gsub(/,/, ".", $20); gsub(/,/, ".", $21); print }'


Je ne savais pas qu'altérer
$20
et
$21
permettait d'altérer implicitement
$0
(implicitement passé en argument du dernier print). L'idée de changer
OFS
pour éviter de le ré-indiquer dans le
print
est également bien vue.

Edit : j'ai vu la réponse de dubcek après coup.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > mamiemando Messages postés 33076 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 avril 2024
25 févr. 2016 à 11:08
Edit : j'ai vu la réponse de dubcek après coup.
J'avais également vu sa réponse (antérieure à la mienne) qu'après avoir posté la mienne. De ce fait sa réponse est plus juste que la mienne, dubcek restant le Maître incontesté pour awk ;-)
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
12 avril 2016 à 14:33
Un peu tard mais merci a tous.
0