Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/06/2016, à 16:58

Link_Octree

[Bash] Restreindre sed ou awk à une colonne d'un fichier csv

Salut à tous,

J'ai le fichier .csv suivant:

05/17/2016 15:37:47,102,11801
05/21/2016 13:45:53,79,116554
05/21/2016 22:03:26,3,9926911

Le second champ est un code numérique, j'aimerais remplacer sa valeur (via sed ou awk) par quelque chose de plus lisible ex:

05/17/2016 15:37:47,GOOGLE,11801
05/21/2016 13:45:53,MICROSOFT,116554

Pour celà, je cherche à resteindre l'exécution de SED ou d'AWK à cette seule colonne. J'avais pensé faire çà avec cut mais çà ne marche pas comme prévu.

Je suis tombé sur ce topic où quelqu'un cherchait à faire la même chose.
Malheureusement, je n'ai pas réussi à adapté le code proposé par un contributeur à mon cas:

awk -F@ '$3 ~ /pattern/ { OFS= "@"; $3 = "replace"; }'

J'ai remplacé les "@" par des virgules vu que ce sont mes séparateurs de champs à moi, et les "$3" par des "$2" vu que c'est la colonne qui m'intéresse à moi... sans succés jusque là.

Si vous pouviez y jeter un coup d'oeil, merci d'avance !

Hors ligne

#2 Le 21/06/2016, à 17:08

Compte anonymisé

Re : [Bash] Restreindre sed ou awk à une colonne d'un fichier csv

Bonjour,

Dans ton exemple on pourrait juste faire ceci :

sed 's/,102,/,GOOGLE,/g;s/,79,/,MICROSOFT,/g'

Cordialement

#3 Le 21/06/2016, à 17:11

Watael

Re : [Bash] Restreindre sed ou awk à une colonne d'un fichier csv

salut,

ne pourrais-tu utiliser join ?
tu ne dis pas d'où viennent les données de remplacement !


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 21/06/2016, à 17:52

Link_Octree

Re : [Bash] Restreindre sed ou awk à une colonne d'un fichier csv

Anonyme68 a écrit :

Bonjour,

Dans ton exemple on pourrait juste faire ceci :

sed 's/,102,/,GOOGLE,/g;s/,79,/,MICROSOFT,/g'

Cordialement

Il peut arriver parfois, coïncidence assez courante, que le troisième champ soit égal au second, hors je ne veux pas remplacer le second champ (corrige moi si je me trompe, mais il me semble que ta commande ne prendrait pas en compte ce cas de figure).

@Watael: Les données de remplacement seraient soient stocké dans le script bash lui même, soit dans une base de données externe csv.

Dernière modification par Link_Octree (Le 21/06/2016, à 17:54)

Hors ligne

#5 Le 21/06/2016, à 18:55

Watael

Re : [Bash] Restreindre sed ou awk à une colonne d'un fichier csv

$ cat fichier_1.csv 
05/17/2016 15:37:47,102,11801
05/21/2016 13:45:53,79,116554
05/21/2016 22:03:26,3,9926911
$ join --nocheck-order -o 1.1 2.2 1.3 -t ',' -2 1 -1 2 <(sort -t ',' -k2,2n fichier_1.csv) <(echo '102,GOOGLE
79,MICROSOFT' | sort -t ',' -k1,1n)
05/21/2016 13:45:53,MICROSOFT,116554
05/17/2016 15:37:47,GOOGLE,11801

à adapter à ton cas.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 21/06/2016, à 20:11

Compte anonymisé

Re : [Bash] Restreindre sed ou awk à une colonne d'un fichier csv

Si tu as 3 champs, seul le deuxième sera entre des virgules. Ma commande remplacera donc que le deuxième champ.

Bon ça fait peut-être un peu bricolage, regardes plutôt la solution de Watael.

Dernière modification par Compte anonymisé (Le 21/06/2016, à 20:15)

#7 Le 22/06/2016, à 09:33

credenhill

Re : [Bash] Restreindre sed ou awk à une colonne d'un fichier csv

hello

$ cat f1
05/17/2016 15:37:47,102,11801
05/21/2016 13:45:53,79,116554
05/21/2016 22:03:26,3,9926911
$ cat f2
102,GOOGLE
79,MICROSOFT
3,EBAY
$ awk 'BEGIN {FS=OFS=","} NF<3 {t[$1]=$2; next} {$2=t[$2]; print}'  f2 f1
05/17/2016 15:37:47,GOOGLE,11801
05/21/2016 13:45:53,MICROSOFT,116554
05/21/2016 22:03:26,EBAY,9926911

Hors ligne