IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Suppression des doublons dans chaque ligne d'un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut Suppression des doublons dans chaque ligne d'un fichier
    Bonjour à tous;

    la simplicité du titre cache la sophistication de ce que je veux parvenir à faire, mais je pouvais pas tout mettre dans le titre, ça rentrait pas
    Mais en gros cette approche est un bon point de départ.


    Alors .... Soit un fichier contenant des dizaines de lignes dont voici quelques lignes en exemple: un fichier datas.txt.bak
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jour="3" article="banane" pepins="sans" categorie="fruit" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange" pepins="avec" categorie="fruit" article="courgette" pepins="sans" categorie="legume" 
    jour="5" article="pomme" pepins="avec" categorie="fruit" article="orange" pepins="avec" categorie="fruit"
    et j'ai planché toute la nuit sans succès, pour obtenir ce type de sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jour="3" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange:[courgette]" pepins="avec:[sans]" categorie="fruit:[legume]" 
    jour="5" article="pomme:[orange]" pepins="avec" categorie="fruit"
    Évidemment que dans le cadre d'une fonction, j'aurais pu m'en sortir en traitant ligne par ligne, mais j'ai fait chauffer les neurones pour trouver la ligne de code pure et élégante, en
    vain. Je soupçonne Awk d'être la commande de la situation, mais c'est pas assez mon pote pour le convoquer, j'ai préféré me tourner vers Sed.
    Vu la sortie attendue, j'ai besoin de l'aide d'un surdoué du scripting, à mon avis. Il est aussi envisageable que ce soit impossible à faire, sauf à pondre une fonction.

    j'étais parti sur un truc du style (c'est pas ça qui m'a pris toute la nuit j'ai beaucoup lu aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat datas.txt.bak > datas.txt; while read line; do newline="$(echo "$line"|tr ' ' '\n'|sort -u|tr '\n' ' ')"; sed -i 's%'"$line"'%'"$newline"'%g' datas.txt;done< <(sed '/jour/p' datas.txt)
    qui donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    article="banane" categorie="fruit" jour="3" pepins="sans" 
    article="courgette" article="orange" categorie="fruit" categorie="legume" jour="6" pepins="avec" pepins="sans"  
    article="orange" article="pomme" categorie="fruit" jour="5" pepins="avec"
    Mettons que article, categorie, jour, pepins, soient les noms de colonnes.
    On voit bien que les valeurs identiques sont réduites à une occurrence (ex ligne 3 +> categorie="fruit" voit son doublon supprimé)
    Évidement je n'ai pas fusionné les valeurs différentes pour une colonne de même nom comme dans la sortie souhaité.
    Mais j'ai une autre contrainte aussi, je veux que l'ordre des colonnes soit respecté tel que présenté dans le fichier source, c'est à dire
    jour - article - pepins - categorie (ordre préservé).

    Pensez vous que c'est faisable ? En fait je pense qu'il y a moyen de manipuler les colonnes tel que je veux mais je n'ai pas les connaissances

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Bonjour,

    tu préférerais pas qu'on discute du format de ce fichier ?
    celui-ci est bien moisi : maintenant pour le convertir, plus tard pour l'exploiter...

  3. #3
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    Bonjour N_Bah
    Citation Envoyé par N_BaH Voir le message
    tu préférerais pas qu'on discute du format de ce fichier ?
    Inutile je t'assure. Évidemment que j'ai pris des exemples de nom de colonne moisis à l'arrache, mais ne pas s'attacher au sens du pourquoi du comment j'obtiens un tel fichier.
    C'est fondé, optimisé, c'est juste qu'avec des jour des articles des catégories et des pépins ça le fait pas mais moi je sais pourquoi
    Tu aurais une idée, je me demande s'il n'y a pas un truc à faire avec join mais je suis un peu perdu par contre là, jamais employé join

  4. #4
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 797
    Points
    797
    Par défaut
    Bonjour,

    sans préjuger des capacités de bash,
    voilà de quoi ne pas vous laisser en carafe,
    et vous évitez d'autres nuits banche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    <?php 
    $k=<<<EOD
    jour="3" article="banane" pepins="sans" categorie="fruit" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange" pepins="avec" categorie="fruit" article="courgette" pepins="sans" categorie="legume" 
    jour="5" article="pomme" pepins="avec" categorie="fruit" article="orange" pepins="avec" categorie="fruit"
    EOD;
     
    $lines = explode("\n", $k);
    foreach($lines as $l) {
        $n=[];
        $key="";
        $value="";
        $in_quote=false;
        $in_escape=false;
        $in_key=true;
        foreach(str_split($l) as $c) {
            if(!$in_quote && $c=='"') {
                $in_quote=true;
                continue;
            }
            if($in_quote && $c=='\\') {
                $in_escape=true;
                continue;
            }
            if($in_quote && $c=='"') {
                if ($in_escape) {
                    $in_escape=false;
                }else{
                    $in_quote=false;
                    continue;
                }
            }
     
            if(!$in_quote && $c==" ") {
                if($key!=""){
                    $n[] = ["name"=>$key,"value"=>$value];
                }
                $key="";
                $value="";
                $in_key=true;
                continue;
            }
            if($in_key && $c=="=") {
                $in_key=false;
                continue;
            }
            if($in_key) {
                $key="$key$c";
            }else{
                $value="$value$c";
            }
        }
        if($key!=""){
            $n[] = ["name"=>$key,"value"=>$value];
        }
     
        $d=[];
        $keys=[];
        $jour="";
        $article="";
        foreach($n as $v){
            if($v["name"]=="jour") {
                $jour=$v["value"];
                continue;
            }
            if($v["name"]=="article") {
                $article=$v["value"];
            }
            $keys[]=$v["name"];
     
            $d[$article][$v["name"]] = $v["value"];
        }
     
        $keys = array_unique($keys);
     
        $res=" jour=".'"'.addslashes($jour).'"';
        foreach($keys as $key) {
            $res.=" $key=";
            $n=0;
            $prev="";
            $val="";
            foreach($d as $v){
                if ($n==0) {
                    $val.= $v[$key];
                }else if($prev!=$v[$key]){
                    $val.=":[".$v[$key]."]";
                }
                $prev=$v[$key];
                $n++;
            }
            $res.='"'.addslashes($val).'"';
        }
        $res=trim($res);
        echo($res."\n");
    }
    produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jour="3" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange:[courgette]" pepins="avec:[sans]" categorie="fruit:[legume]"
    jour="5" article="pomme:[orange]" pepins="avec" categorie="fruit"
    Bonne journée.

  5. #5
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    Oui .... merci beaucoup. Voici plantées les bases pour une belle solution de repli, lorsque j'aurai rendu les armes ....
    Malheureusement la gestion des tableaux Bash est quelque peu "triviale", mais il y a moyen. Tiens je vais tenter de rentrer les lignes dans un tableau associatif pour voir si ça me donne pas un pavé de code.
    Mais franchement je pense qu'Awk est l'homme de la situation, pour qui sait l'utiliser

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    tu devrais remplacer
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    jour="5" article="pomme" pepins="avec" categorie="fruit" article="orange" pepins="avec" categorie="fruit"
    par
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    jour="5" article="pomme de terre" pepins="sans" categorie="légume" article="orange" pepins="avec" categorie="fruit"

    quand je pense qu'il y a des gens qui ont normalisé des formats de fichiers de données (CSV, XML, JSON) pour faciliter leur accès...
    mais bon, l'important c'est que ce soit optimisé, et que tu saches pour( )quoi.

  7. #7
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    Mais ouiiiiii ne t'attache pas au format du fichier, je maintiens que ça se présente ainsi, prendre l'exemple tel quel sans se demander quel est le code vérolé d'un esprit hypothétiquement malade responsable de la production d'un tel fichier je t'en prie lol.

  8. #8
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    je suis sur une piste en utilisant un tableau associatif, mais le problème c'est qu'à sa déclaration, ça m'écrase les clés identiques c'est balot. Cependant je peux les retrouver en exploitant la ligne. Déjà il fallait que j'arrive à mettre chaque ligne dans un tableau associatif, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cat datas.txt.bak > datas.txt; while read line; do
      echo "line:$line" # à exploiter et comparer aux clés
      declare -A "newArray=( $(echo ${line[*]}|sed 's/\([^=]*\)=\([^ ]*\) \?/[\1]=\2 /g') )" # ! importance des "" .... (pourquoi ? pas capté)
      declare -p newArray
    done< <(sed 's/"//g' datas.txt)
    pond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    line:jour=3 article=banane pepins=sans categorie=fruit article=banane pepins=sans categorie=fruit
    declare -A newArray=([categorie]="fruit" [pepins]="sans" [article]="banane" [jour]="3" )
    line:jour=6 article=orange pepins=avec categorie=fruit article=courgette pepins=sans categorie=legume
    declare -A newArray=([categorie]="legume" [pepins]="sans" [article]="courgette" [jour]="6" )
    line:jour=5 article=pomme pepins=avec categorie=fruit article=orange pepins=avec categorie=fruit
    declare -A newArray=([categorie]="fruit" [pepins]="avec" [article]="orange" [jour]="5" )
    pas si beurk ; mais bien loin du résultat souhaité. je vais peut-être être obligé de rentrer les colonnes dans un tableau normal indexé, pour conserver l'ordre, ou afficher dans l'ordre voulu en dur (style afficher newArray[jour] ; newArray[article] etc ...

    mais snifff, je suis sûr qu'en deux lignes ou moins de awk je suis comblé. Va t'il falloir que je me penche un mois sur awk en mode immersion ?

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat bobawk.txt
    jour="3" article="banane" pepins="sans" categorie="fruit" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange" pepins="avec" categorie="fruit" article="courgette" pepins="sans" categorie="legume"
    jour="5" article="pomme" pepins="avec" categorie="fruit" article="orange" pepins="avec" categorie="fruit"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk -F'[ =]' 'BEGIN{PROCINFO["sorted_in"]="@val_num_asc"}{for (i=1;i<NF;i=i+2){B[$(i)]=i;A[$(i)][$(i+1)]=i};for (i in B){C=1;for(j in A[i]){if (C==1){D[i]=j;C++} else D[i]=D[i]j;R=gensub(/""([^"]*)"/,":[\\1]\"","g",D[i])}printf i"="R" "}delete A;print ""}' bobawk.txt
    jour="3" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange:[courgette]" pepins="avec:[sans]" categorie="fruit:[legume]"
    jour="5" article="pomme:[orange]" pepins="avec" categorie="fruit"

  10. #10
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    merci beaucoup disedorgue mais je pense qu'il y a une erreur ....
    ./disedorgue.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #!/bin/bash
    awk -F'[ =]' 'BEGIN{
    	PROCINFO["sorted_in"]="@val_num_asc"
    	}
    	{
    		for (i=1;i<NF;i=i+2){
    			B[$(i)]=i;A[$(i)][$(i+1)]=i
    		}
    		for (i in B){C=1
    			for(j in A[i]){
    				if (C==1){
    					D[i]=j;C++
    				} else D[i]=D[i]j
    				R=gensub(/""([^"]*)"/,":[\\1]\"","g",D[i])
    			}
    			printf i"="R" "
    		}
    		delete A;print ""
    	}' datas.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    awk: line 4: syntax error at or near [
    awk: line 7: syntax error at or near [
    awk: line 10: syntax error at or near else
    awk: line 13: syntax error at or near printf
    J'ose pas toucher (sauf que j'ai indenté pour essayer de voir où ça va pas). Ta ligne telle quelle c'est pareil ça m'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    awk: line 1: syntax error at or near [
    awk: line 1: syntax error at or near [
    awk: line 1: syntax error at or near else
    awk: line 1: syntax error at or near printf


    ps: ça modifie le fichier là où ça sort sur l'entrée standard ?

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Le code est spécifique gawk, chez moi la ligne fonctionne, après c'est peut être le copier/coller qui est foireux mais la, je ne peux pas vérifier pour l'instant.

  12. #12
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Le code est spécifique gawk, chez moi la ligne fonctionne, après c'est peut être le copier/coller qui est foireux mais la, je ne peux pas vérifier pour l'instant.
    Après installation de gawk et gawk-doc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    gawk:
      Installé*: 1:4.2.1+dfsg-1
      Candidat*: 1:4.2.1+dfsg-1
     Table de version*:
         1:5.1.0-1 50
             50 http://deb.debian.org/debian bullseye/main amd64 Packages
     *** 1:4.2.1+dfsg-1 500
            500 http://deb.debian.org/debian buster/main amd64 Packages
            100 /var/lib/dpkg/status
    whaaaao comme c'est beau !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jour="3" article="banane" pepins="sans" categorie="fruit" 
    jour="6" pepins="avec:[sans]" categorie="fruit:[legume]" article="orange:[courgette]"
    jour="5" article="pomme:[orange]" pepins="avec" categorie="fruit"
    c'est solaire mais j'y comprends rien. Ça marche bien vu !
    par contre entre temps je viens de finir ma variante en utilisant un tableau -A, et j'ai corsé en rajoutant une colonne categorie="framboise" et là du coup ton code ne prend plus en compte cette nouvelle entrée ... et j'ose pas toucher vu que c'est du chinois pour l'instant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    #!/bin/bash
    cat datas.txt.bak > datas.txt;
    echo "source:"
    cat datas.txt
    echo "Result: "
    while read line; do
    	n_occur_articles=$(echo $line | grep -o article |wc -w)
    	articles="$(echo "$line" | tr ' ' '\n' | sed -n '/article=/p' | sort -u | tr '\n' ' ' | sed 's/article=//g;s/ $//')"
    	n_occur_categories=$(echo $line | grep -o categorie |wc -w)
    	categories="$(echo "$line" | tr ' ' '\n' | sed -n '/categorie=/p' | sort -u | tr '\n' ' ' | sed 's/categorie=//g;s/ $//')"
    	n_occur_pepins=$(echo $line | grep -o pepins |wc -w)
    	pepins="$(echo "$line" | tr ' ' '\n' | sed -n '/pepins=/p' | sort -u | tr '\n' ' ' | sed 's/pepins=//g;s/ $//')"
     
    	declare -A "newArray=( $(echo ${line[*]}|sed 's/\([^=]*\)=\([^ ]*\) \?/[\1]=\2 /g;s/\([^=]*\)=\([^ ]*\)$/[\1]=\2/g') )"
    	# article
    	if [ "${newArray[article]}" != "$articles" ] && [ "$n_occur_articles" -gt "1" ]; then
    		newArray[article]=$(echo "$articles" | sed -e 's/\([^ ]\+\) /\1:/g;s/:\([^:]\+\)/:\[\1\]/g')
    	fi
    	# categorie
    	if [ "${newArray[categorie]}" != "$categories" ] && [ "$n_occur_categories" -gt "1" ]; then
    		newArray[categorie]=$(echo "$categories" | sed -e 's/\([^ ]\+\) /\1:/g;s/:\([^:]\+\)/:\[\1\]/g')
    	fi
    	# pepins
    	if [ "${newArray[pepins]}" != "$pepins" ] && [ "$n_occur_pepins" -gt "1" ]; then
    		newArray[pepins]=$(echo "$pepins" | sed -e 's/\([^ ]\+\) /\1:/g;s/:\([^:]\+\)/:\[\1\]/g')
    	fi
    	# declare -p newArray
    	echo jour="${newArray[jour]}" article="${newArray[article]}" catetorie="${newArray[categorie]}" pepins="${newArray[pepins]}"
    	# for cle in "${!newArray[@]}" ;do echo "$cle => ${newArray[$cle]}" ; done
    done< <(sed 's/"//g' datas.txt)
    sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    source:
    jour="3" article="banane" pepins="sans" categorie="fruit" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange" pepins="avec" categorie="fruit" article="courgette" pepins="sans" categorie="legume" article="framboise"
    jour="5" article="pomme" pepins="avec" categorie="fruit" article="orange" pepins="avec" categorie="fruit" 
    Result: 
    jour="3" article="banane" catetorie="fruit" pepins="sans"
    jour="6" article="courgette:[framboise]:[orange]" catetorie="fruit:[legume]" pepins="avec:[sans]"
    jour="5" article="orange:[pomme]" catetorie="fruit" pepins="avec"
    un pavé quoi ....

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    awk -F'[ =]' 'BEGIN{

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/gawk -f 
     
    BEGIN{
        FS="[ =]"
        ARGV[ARGC++]="datas.txt" #il est préférable d'indiquer le chemin absolu vers le fichier
    #etc...

  14. #14
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    N_BaH tu veux bien réécrire le bloc entier ? là j'ai juste modifié ton extrait et ça bugue ... stp

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 311
    Points : 12 830
    Points
    12 830
    Par défaut
    un petit correctif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[ =]' 'BEGIN{PROCINFO["sorted_in"]="@val_num_asc"}{for (i=1;i<NF;i=i+2){if (!B[$(i)]) {B[$(i)]=i};A[$(i)][$(i+1)]=i};for (i in B){C=1;for(j in A[i]){if (C==1){D[i]=j;C++} else D[i]=D[i]j;D[i]=gensub(/""([^"]*)"/,":[\\1]\"","g",D[i])}printf i"="D[i]" "}delete A;print ""}' bobawk.txt

  16. #16
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    un petit correctif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[ =]' 'BEGIN{PROCINFO["sorted_in"]="@val_num_asc"}{for (i=1;i<NF;i=i+2){if (!B[$(i)]) {B[$(i)]=i};A[$(i)][$(i+1)]=i};for (i in B){C=1;for(j in A[i]){if (C==1){D[i]=j;C++} else D[i]=D[i]j;D[i]=gensub(/""([^"]*)"/,":[\\1]\"","g",D[i])}printf i"="D[i]" "}delete A;print ""}' bobawk.txt
    Magnifique ! Dire que tu as fait ça entre deux mouches qui volent si il faut ça me . Merciii

    j'attends juste la variante N_BaH et je mets en résolu

  17. #17
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/gawk -f
     
    BEGIN{
        FS="[ =]"
        PROCINFO["sorted_in"]="@val_num_asc"
        ARGV[ARGC++]="datas.txt" #il est préférable d'indiquer le chemin absolu vers le fichier, et il faut adapter le nom du fichier !
    }
    #suit le reste du script inchangé
    si ça ne fonctionne pas, affiche-nous le message d'erreur.

  18. #18
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 134
    Points : 128
    Points
    128
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/usr/bin/gawk -f
     
    BEGIN{
        FS="[ =]"
        PROCINFO["sorted_in"]="@val_num_asc"
        ARGV[ARGC++]="datas.txt" #il est préférable d'indiquer le chemin absolu vers le fichier, et il faut adapter le nom du fichier !
    }
    #suit le reste du script inchangé
    {
    	for (i=1;i<NF;i=i+2){
    		if (!B[$(i)]) {
    			B[$(i)]=i
    		};A[$(i)][$(i+1)]=i
    	}
    	for (i in B){
    		C=1
    		for(j in A[i]){
    			if (C==1){
    				D[i]=j;C++
    			} else D[i]=D[i]j
    			D[i]=gensub(/""([^"]*)"/,":[\\1]\"","g",D[i])
    		}
    		printf i"="D[i]" "
    	}
    	delete A
    	print ""
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    :~/test$ ./Disedorgue-by-N_BaH.sh 
    jour="3" article="banane" pepins="sans" categorie="fruit" 
    jour="6" article="orange:[courgette]:[framboise]" pepins="avec:[sans]" categorie="fruit:[legume]" 
    jour="5" article="pomme:[orange]" pepins="avec" categorie="fruit"

    pfff smiley chapeau bas les amis, merci beaucoup. Va falloir que je me mette à Awk ... C'est propre, juste un peu hiéroglyphique de prime abord

  19. #19
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Je suis de bonne humeur, voici donc quelques détails sur le awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    BEGIN{
            PROCINFO["sorted_in"]="@val_num_asc" #pour parcourir les tableaux assoc en triant sur les valeur par ordre croissant
    }
    {
            for (i=1;i<NF;i=i+2){ # on parcourt tous les champs impair
                    if (!B[$(i)]) { # si le champs n'existe pas encore dans le tableau
                            B[$(i)]=i # on crée la clé en lui associant en valeur le numero du champs (pour le tri)
                    }
                    A[$(i)][$(i+1)]=i # on crée un tableau bidimensionnel champs/valeur=numéro du champs (pour le tri) en meme temps un tableau associatif de clé permet de virer les doublons
            }
            for (i in B){ # on parcourt le te tbleau B trier par valeur (qui ici est le numéro du champs)
                    C=1
                    for(j in A[i]){ # on parcourt le tableau A via les clé du tableau B 
                            if (C==1){
                                    D[i]=j;C++
                            } 
                            else    
                                    D[i]=D[i]j
                            D[i]=gensub(/""([^"]*)"/,":[\\1]\"","g",D[i]) # on réecrit les valeurs des clé multiple
                    }
                    printf i"="D[i]" "
            }
            delete A
            print ""
    }

  20. #20
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Qui ce lance pour un "PUR" bash (que de la builtin) ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Suppression des doublons dans une variable de type tableau
    Par damsmut dans le forum Général VBA
    Réponses: 2
    Dernier message: 23/07/2019, 11h36
  2. [XL-2003] suppression des doublons dans une Combobox
    Par karim19 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/10/2009, 17h42
  3. [Tableaux] suppression des doublons dans un tableau
    Par hammag dans le forum Langage
    Réponses: 3
    Dernier message: 17/06/2009, 20h13
  4. problème avec la suppression des doublons dans arraylsit
    Par ulysse031 dans le forum Langage
    Réponses: 13
    Dernier message: 04/03/2007, 13h52
  5. Réponses: 13
    Dernier message: 20/11/2006, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo