Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1481 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  ajouter un mot en début de ligne par rapport à la valeur cherchée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ajouter un mot en début de ligne par rapport à la valeur cherchée

n°993791
tabasko
Posté le 21-12-2007 à 10:25:41  profilanswer
 

Bonjour à tous !
 
Je cherche à faire un script, mais manifestement il me manque un peu de connaissance pour y parvenir.
Je dois lire un gros fichier ligne par ligne, et en fonction du contenu d'une colonne (dans mon exemple, la colonne 3), je voudrai rajouter un mot précis en début de ligne.
 
L'action serait :

  • lire ligne1.
  • regarder si le champ 3 contient la chaine "1"
  • si oui, créer au début de cette ligne "Type1", passer à la ligne suivante
  • si le champ3 contient "2" ... type2, si "3" Type3, si pas 1 ni 2 ni 3, créer TypeAutre.


 
Par exemple si mon fichier original est :
AAA BBB CC1 DDD EEE FFF GGG
AAA BBB C2C DDD EEE FFF GGG
AAA BBB 3DD EEE FFF GGG HHH
AAA BBB CCC EEE FFF GGG HHH
 
 
En sortie je voudrai être capable d'obtenir :
Type1 AAA BBB CC1 DDD EEE FFF GGG
Type2 AAA BBB C2C DDD EEE FFF GGG
Type3 AAA BBB 3DD EEE FFF GGG HHH
TypeAutre AAA BBB CCC EEE FFF GGG HHH
 
PS : les valeurs que je cherche dans la colonne 3 (et dont dépend le mot rajouté en début de chaque ligne) peut varier et la structure du champs n'est pas forcement homogène (je peux chercher un jeu de 4 caractères par exemple, mais pas forcement situé au même endroit dans la chaine caratères (mais toujours dans la même colonnes).
 
J'ai essayer de faire une boucle pour lire sans succès, puis me suis pencher un peu sur sed .
 
Je suis en misère.
Merci à ceux qui prendront le temps de m'aider.
 
 
 
 
 
 
 
 

mood
Publicité
Posté le 21-12-2007 à 10:25:41  profilanswer
 

n°993819
matafan
Posté le 21-12-2007 à 11:06:21  profilanswer
 

En awk :

#!/usr/bin/awk -f
 
BEGIN {
        type["CC1"] = "Type1"
        type["C2C"] = "Type2"
        type["3DD"] = "Type3"
}
 
{
        if ($3 in type) {
                print type[$3] " " $0
        } else {
                print "TypeAutre " $0
        }
}

n°993829
tabasko
Posté le 21-12-2007 à 11:32:29  profilanswer
 

dans votre exemple, le fichier texte source s'appelle type ? si "non" comment j'applique le script au dit fichier.
J'ai besoin de chercher dans la colonne 3 des valeurs qui s'y balade, et non un chaine précise et répétitive de caractère.
 
si votre script peut être accompagné de quelques explications succintes, cela m'aidera à mieux comprendre  :sarcastic:

n°993839
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 11:45:13  profilanswer
 

tabasko a écrit :

 

[...]

 

L'action serait :

  • lire ligne1.
  • regarder si le champ 3 contient la chaine "1"
  • si oui, créer au début de cette ligne "Type1", passer à la ligne suivante
  • si le champ3 contient "2" ... type2, si "3" Type3, si pas 1 ni 2 ni 3, créer TypeAutre.


[...]

 


 

Pas optimisé mais sous cette forme tu devrais comprendre :

#!/bin/sh

 

# lire les lignes une par une
while read line; do
    # récupérer le champ 3
    F3=$(echo "${line}" | cut -d ' ' -f 3)

 

    # extraire la valeur numérique, ou "Autre" si ca échoue
    NUM=$( (echo "${F3}" | grep -o '[0-9]') || (echo "Autre" ) )

 

    # écrire la ligne
    echo "Type${NUM} ${line}"

 

done < fichier.txt

 


Message édité par Xavier_OM le 21-12-2007 à 11:46:11

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°993850
tabasko
Posté le 21-12-2007 à 12:09:42  profilanswer
 

Merci, je comprends la logique :)
 
Cela dit, mon exemple reste trop simpliste par rapport à mon besoin réel.
Voici donc un échantillon tronqué de mon fichier source :
 
None  |  Unknown  |  5076  |  None-TOTO-800  |  01/11/07  |  30/11/07  |  0
None  |  Unknown  |  5077  |  None-TOTO-800  |  01/11/07  |  30/11/07  |  537
None  |  Unknown  |  5078  |  None-TITI-800  |  01/11/07  |  30/11/07  |  1
None  |  Unknown  |  5079  |  None-GROUP1-800  |  01/11/07  |  30/11/07  |  2
None  |  Unknown  |  5076  |  None800_GROUP2  |  01/11/07  |  30/11/07  |  4
None  |  Unknown  |  5077  |  None_GROUP_-800  |  01/11/07  |  30/11/07  |  537
None  |  Unknown  |  5078  |  None-GROUP1-800  |  01/11/07  |  30/11/07  |  10
None  |  Unknown  |  5079  |  None-ITA-800  |  01/11/07  |  30/11/07  |  22
 
je souhaite obtenir :  
TOTO | None  |  Unknown  |  5076  |  None-TOTO-800  |  01/11/07  |  30/11/07  |  0
TOTO | None  |  Unknown  |  5077  |  None-TOTO-800  |  01/11/07  |  30/11/07  |  537
TITI | None  |  Unknown  |  5078  |  None-TITI-800  |  01/11/07  |  30/11/07  |  1
GROUP1 | None  |  Unknown  |  5079  |  None-GROUP1-800  |  01/11/07  |  30/11/07  |  2
GROUP2 | None  |  Unknown  |  5076  |  None800_GROUP2  |  01/11/07  |  30/11/07  |  4
GROUP | None  |  Unknown  |  5077  |  None_GROUP_-800  |  01/11/07  |  30/11/07  |  537
GROUP1 | None  |  Unknown  |  5078  |  None-GROUP1-800  |  01/11/07  |  30/11/07  |  10
Autre | None  |  Unknown  |  5079  |  None-ITA-800  |  01/11/07  |  30/11/07  |  22
 
Les  |  sont juste ici pour une lecture plus facile des tabulations.


Message édité par tabasko le 21-12-2007 à 12:11:56
n°993852
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 12:20:39  profilanswer
 

Ben c'est quoi ton motif :
'N'importe quoi' 'tiret et/ou underscore' 'N'importe quoi' 'tiret et/ou underscore' 'N'importe quoi'  ?
 
Parce que matcher ca et en garder un seul morceau c'est pas bien dur :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°993862
tabasko
Posté le 21-12-2007 à 12:53:12  profilanswer
 

J'ai moins de 10 motifs.
Ils sont délimités par des "-" ou "_" .... Je préfères néanmoins fonctionner avec une liste de motifs précis en les recherchant ligne par ligne, car certains motifs seront regroupés ... (par exclusion du reste (else)).
 
Merci de votre temps et de votre aide.

n°993912
matafan
Posté le 21-12-2007 à 14:08:07  profilanswer
 

tabasko a écrit :

dans votre exemple, le fichier texte source s'appelle type ? si "non" comment j'applique le script au dit fichier.


Comme toute commande unix qui se respecte, elle prend le nom de fichier en argument, ou bien elle lit sur stdin. Bref, deux façons de la lancer (en supposant que tu l'appelles "script.awk", et que ton fichier soit appelé "fichier" ) :

./script.awk fichier


Ou bien :

./script.awk < fichier


Ou évidemment toutes les variantes :

cat fichier | ./script.awk
grep toto fichier | ./script.awk
...


tabasko a écrit :

J'ai besoin de chercher dans la colonne 3 des valeurs qui s'y balade, et non un chaine précise et répétitive de caractère.


Ah OK j'avais pas compris ça comme ça. Tu as plusieurs valeurs possibles pour la colonne 3, tu ne les connais pas à l'avance, et tu veux donc générer les "type1", "type2" ... "typeN" dynamiquement, c'est ça ? Rien de plus simple, toujours en awk :

#!/usr/bin/awk -f
 
{
        if (!($3 in type)) {
                ntypes++
                type[$3] = "type" ntypes
        }
        print type[$3] " " $0
}


Explications : chaque bloc d'un script awk (là il n'y en a qu'un) est exécuté pour chaque ligne lue en entrée (cad chaque ligne de ton fichier). $0 représentes la ligne complète. $1 est la première colone de la ligne en cours, $2 est la deuxième colone, $3 est la troisième colone, etc. Dans ce script "type" est un tableau, qui sont en fait des hash en awk (il n'y a pas de "vrai" tableau, tous les tableaux sont indexés par des chaines de caractère en awk, pas par des nombres). Ce tableau sert à associer, pour chaque type lu en colone 3, le nom de ce type. Donc c'est super simple : pour chaque ligne du fichier, on regarde la 3ème colone. Si c'est la première fois qu'on rencontre ce type, on incrémente "ntypes" (nombre total de types), et on nomme ce type "typeN", où N est ntypes. Dans tous les cas, on affiche la ligne complète ($0) précédée par le nom du type, qu'on a rangé dans le tableau "type" (type[$3]).


Message édité par matafan le 21-12-2007 à 14:10:33
n°993937
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 14:35:23  profilanswer
 

tabasko a écrit :

J'ai moins de 10 motifs.
Ils sont délimités par des "-" ou "_" .... Je préfères néanmoins fonctionner avec une liste de motifs précis en les recherchant ligne par ligne, car certains motifs seront regroupés ... (par exclusion du reste (else)).
 
Merci de votre temps et de votre aide.


 
Sauf que dans ton exemple ya un "None_GROUP_-800" (donc - et _) :/ Et aussi un "None800_GROUP2" (donc rien après le groupe) :/
 
Si c'est toujours un - ou un _, et qu'il y a toujours 3 morceaux c'est très simple.
Si jamais ca peut être "les 2, voire parfois de temps en temps une virgule, en fait un peu n'importe quoi mais on reconnait bien le groupe non ?" c'est totalement imprécis et peu adapté au traitement (ca se sent que j'ai l'habitude de parser dla merde non ? :D)
 
 
Si on se limite à ton exemple, ca fait :
 
un nombre quelconque de lettres minuscules ou majuscules, ou de chiffres :
[a-zA-Z0-9]\+
 
au moins un délimiteur (parfois deux), en tout cas toujours - ou _ :
[-_]\+
 
un nombre quelconque de lettres minuscules ou majuscules, ou de chiffres :
[a-zA-Z0-9]\+
 
ce coup-ci le délimiteur peut ne pas être là (s'il manque le 3ème morceau)
[-_]*
 
le troisième morceau, qui donc peut ne pas être là :
[a-zA-Z0-9]*
 
 
Au final :
[a-zA-Z0-9]\+[-_]\+[a-zA-Z0-9]\+[-_]*[a-zA-Z0-9]*
 
Et on veut garder seulement le morceau du milieu, donc on lui met des parenthèses autour, \( et \), et dans sed on rappelera ce morceau avec \1
[a-zA-Z0-9]\+[-_]\+\([a-zA-Z0-9]\+\)[-_]*[a-zA-Z0-9]*
 
 
Est-ce que ca marche sur ton échantillon ? Oui :

for i in None-TOTO-800 None-TOTO-800 None-TITI-800 None-GROUP1-800 None800_GROUP2 None_GROUP_-800 None-GROUP1-800 None-ITA-800; do
    echo "${i}" | sed 's/[a-zA-Z0-9]\+[-_]\+\([a-zA-Z0-9]\+\)[-_]*[a-zA-Z0-9]*/\1/'
done


=>

TOTO
TOTO
TITI
GROUP1
GROUP2
GROUP
GROUP1
ITA


 
Est-ce que ca marchera sur tout ? Aucune idée, il FAUT que tu définisses clairement TOUT ce qui peut être dans cette colonne 3  [:spamafote]


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°993947
tabasko
Posté le 21-12-2007 à 15:04:47  profilanswer
 

ce qui est en colones 4 changera tout les mois.
 
au risque de me répéter dans un soucis de clareté ... j'ai besoin de faire ce script avec du conditionel.
 
"si le champ 4 contient le mot TOTO, rajouter le mot toto en début de ligne"
 
J'en aurai moins de 10 à définir .... en revanche il existe un nombre infini de combinaison possible pour les valeurs qui tomberont dans la colonne 4 (et/mais toujours contiendra l'un des 10 motifs clefs).
 
Désolé si je m'exprime mal.
Merci pour les efforts mis en oeuvre.
 
Xavier, merci aussi pour vos notes précieuses que j'archive pour d'autre usage futur.
 

mood
Publicité
Posté le 21-12-2007 à 15:04:47  profilanswer
 

n°993949
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 15:09:04  profilanswer
 

tabasko a écrit :

ce qui est en colones 4 changera tout les mois.
 
au risque de me répéter dans un soucis de clareté ... j'ai besoin de faire ce script avec du conditionel.
 
"si le champ 4 contient le mot TOTO, rajouter le mot toto en début de ligne"
 
J'en aurai moins de 10 à définir .... en revanche il existe un nombre infini de combinaison possible pour les valeurs qui tomberont dans la colonne 4 (et/mais toujours contiendra l'un des 10 motifs clefs).
 
Désolé si je m'exprime mal.
Merci pour les efforts mis en oeuvre.
 
Xavier, merci aussi pour vos notes précieuses que j'archive pour d'autre usage futur.
 


 
Si on prend mon premier script, qu'on remplace 3 par 4, et qu'on remplace l'extraction de la valeur numérique par le "echo | sed blablabla" de mon dernier message, on obtient bien un script qui rajoute TOTO si le champ 4 contient TOTO  :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°993962
tabasko
Posté le 21-12-2007 à 15:29:48  profilanswer
 

Xavier,  je m'y perds..................
 
 
 
#!/bin/sh
 
 
# lire les lignes une par une
while read line; do  
    # récupérer le champ 4
    F4=$(echo "${line}" | cut -d ' ' -f 4)
 
 
    # extraire la valeur numérique, ou "Autre" si ca échoue
    #NUM=$( (echo "${F3}" | grep -o '[0-9]') || (echo "Autre" ) )
      NUM=$(echo "${i}" | sed 's/[a-zA-Z0-9]\+[-_]\+\([a-zA-Z0-9]\+\)[-_]*[a-zA-Z0-9]*/\1/')
 
    # écrire la ligne
    echo "Type${NUM} ${line}"
 
 
done < fichier.txt
 

n°993971
tabasko
Posté le 21-12-2007 à 15:37:34  profilanswer
 

je viens d'essayer et cela me rajouter "Type" en début de chaque ligne.
donc maintenant, et cela m'échappe encore, à quel endroit je vais placer ma dizaine de motifs .... il est ou l'egrep ?  
 
Pareil, me tapez pas dessus $i il sort d'où Xavier ?
Merci.

n°993974
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 15:47:38  profilanswer
 

tabasko a écrit :

je viens d'essayer et cela me rajouter "Type" en début de chaque ligne.
donc maintenant, et cela m'échappe encore, à quel endroit je vais placer ma dizaine de motifs .... il est ou l'egrep ?  
 
Pareil, me tapez pas dessus $i il sort d'où Xavier ?
Merci.


 
c'est F3F4


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°993979
tabasko
Posté le 21-12-2007 à 15:55:20  profilanswer
 

bien. et quant à ma première question , l'association des termes (entre celui que je cherche et celui qui va devenir mon motif de début de ligne) je le place ou dans le script ?
 
 
De là à ce que vous me répondiez, j'essaye de comprendre péniblement dès fois que j'y arrive  :pt1cable:  

n°993982
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 16:01:31  profilanswer
 

Nulle part,

NUM=$(echo "${F4}" | sed 's/[a-zA-Z0-9]\+[-_]\+\([a-zA-Z0-9]\+\)[-_]*[a-zA-Z0-9]*/\1/')


"détecte" dans la colonne 4 le motif à mettre en début de ligne et le stock dans NUM.
 
Pas besoin de prédéfinir une liste de motifs à chercher, cette expression régulière les trouvera à partir du moment où on a bien :
blablabla, puis - ou _, puis blablabla, puis - ou _, puis blablabla (avec les précautions expliquées précedemment quand au troisième morceau qui apparement n'est pas toujours là)
 
 
Si on veut prédéfinir une liste on peut, mais donc sur chaque ligne on va tester tous les motifs jusqu'à trouver celui qui va bien, c'est pas mal plus long du coup comme traitement (et c'est pas tout à fait le même script évidemment :o).


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°993983
tabasko
Posté le 21-12-2007 à 16:04:20  profilanswer
 

Xavier, comme vous avez le temps de détailler vos réponses, j'ai pris le temps de les relire, et je comprends que dans l'état cela devrait fonctionner, et c'est exactement ce que je cherche à faire.
 
Par contre cela ne fonctionne pas ...  
 
Dans mon échantillon j'ai des mentions de type "None-TITI-800" et en début de ligne le script ne me sort que le mot "Type".
 
Ou est ce que j'ai pu me tromper ? pourrait ce être une histoire de délimiteur mal interprété ???
 

Citation :

#!/bin/sh
 
 
# lire les lignes une par une
while read line; do
    # recuperer le champ 4
    F4=$(echo "${line}" | cut -d ' ' -f 4)
 
 
    # extraire la valeur numerique, ou "Autre" si ca échoue
   #NUM=$( (echo "${F3}" | grep -o '[0-9]') || (echo "Autre" ) )
      NUM=$(echo "${i}" | sed 's/[a-zA-Z0-9]\+[-_]\+\([a-zA-Z0-9]\+\)[-_]*[a-zA-Z0-9]*/\1/')
 
    # ecrire la ligne
    echo "Type${NUM} ${line}"
 
 
done < allData.txt

n°993986
tabasko
Posté le 21-12-2007 à 16:07:46  profilanswer
 

nos derniers messages se sont croisés.
merci pour votre explication, c'est ce que j'ai compris en effet en vous relisant.
 
En sortie, malgré cela, je n'obtiens toujours que "Type" et à aucun moment les valeurs comprises entre les "-".
Je viens de faire une recherche des valeurs existantes en colonnes 4 ... j'en ai pas mal avec 3 x "-" ...  
 
genre : blabla-TOTO-titi-800 , c'est toto qui m'intéresse, le présent code ne pourra pas dissocier le TOTO du titi ... non ?  :(

n°993988
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 16:11:08  profilanswer
 

tabasko a écrit :

nos derniers messages se sont croisés.
merci pour votre explication, c'est ce que j'ai compris en effet en vous relisant.
 
En sortie, malgré cela, je n'obtiens toujours que "Type" et à aucun moment les valeurs comprises entre les "-".
Je viens de faire une recherche des valeurs existantes en colonnes 4 ... j'en ai pas mal avec 3 x "-" ...  
 
genre : blabla-TOTO-titi-800 , c'est toto qui m'intéresse, le présent code ne pourra pas dissocier le TOTO du titi ... non ?  :(


 
 
Ah oui, si parfois on a 4 morceaux et que le morceau à garder peut être le 2 ou le 3 selon les cas, il n'y a pas de solution (enfin si mais ca devient un peu sportif).
Il faut donc bien préparer une liste des mots à détecter en colonne 4, et pour chaque ligne tester un par un ces mots pour voir lequel est présent  [:spamafote]


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°993992
tabasko
Posté le 21-12-2007 à 16:19:27  profilanswer
 

1/ je vois pas ou je place ma recherche condition de mot à tester , pourriez vous me mettre sur le chemin? (1 exemple avec TOTO m'irait bien)
2/ cut -d ' ' -f 4)  = le séparteur retenu est l'espace ou la tabulation avec cette syntaxe ?
 
Merci

n°993999
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 16:47:19  profilanswer
 

tabasko a écrit :

1/ je vois pas ou je place ma recherche condition de mot à tester , pourriez vous me mettre sur le chemin? (1 exemple avec TOTO m'irait bien)
2/ cut -d ' ' -f 4)  = le séparteur retenu est l'espace ou la tabulation avec cette syntaxe ?
 
Merci


 
1)  
à la place de  

   # extraire le motif dans F4, ou "Autre" si ca échoue
    NUM=blablabla F4 blablabla


il faut mettre une boucle du genre :

   # test une par une les valeurs prédéfinies jusqu'à trouver un truc dans F4
    PREFIX=""
    for mot in TATA TOTO TUTU; do
        if echo "${F4}" | grep -q "${mot}"; then
            # trouvé !
            PREFIX="${mot}"
        fi
    done


     
2) man cut pour  consulter le manuel (de base c'est tabulation, mais là avec "-d ' '" je précise que je veux un espace pour délimiteur)


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°994006
tabasko
Posté le 21-12-2007 à 17:29:55  profilanswer
 

je suis pas certain qu'il vérifie de condition (malgré le -q d'après ce que j'ai compris qui stop le grep )....
en sortie, il ne me donne pour ${mot} que la dernière entrée que j'ai communiquée.... (par rapport à mon ex, TUTU).
 
 

Citation :

#!/bin/sh
 
 
while read line; do
    F4=$(echo "${line}" | cut -d ' ' -f 4)
 
 
    PREFIX=""
    for mot in TATA TOTO TITI TUTU; do
        if echo "${F4}" | grep -q "${mot}"; then
            PREFIX="${mot}"
        fi
    done
    echo "${mot} ${line}"
 
 
done


 
Xavier, je pense que je vais un peu décrocher pour le moment, je répondrai les soirs tards, ou lundi ...
Encore merci pour le temps et les précisions que vous m'avez communiquées.

n°994019
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-12-2007 à 18:25:57  profilanswer
 

tabasko a écrit :

je suis pas certain qu'il vérifie de condition (malgré le -q d'après ce que j'ai compris qui stop le grep )....
en sortie, il ne me donne pour ${mot} que la dernière entrée que j'ai communiquée.... (par rapport à mon ex, TUTU).
 
 

Citation :

#!/bin/sh
 
 
while read line; do
    F4=$(echo "${line}" | cut -d ' ' -f 4)
 
 
    PREFIX=""
    for mot in TATA TOTO TITI TUTU; do
        if echo "${F4}" | grep -q "${mot}"; then
            PREFIX="${mot}"
        fi
    done
    echo "${mot} ${line}"
 
 
done


 
Xavier, je pense que je vais un peu décrocher pour le moment, je répondrai les soirs tards, ou lundi ...
Encore merci pour le temps et les précisions que vous m'avez communiquées.


 
La boucle et le if permettent de mettre le bon mot (et uniquement le bon mot) dans $PREFIX
Il faut donc faire à la fin echo "${PREFIX} ${line}" (et non plus $mot)


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°994604
tabasko
Posté le 24-12-2007 à 10:38:37  profilanswer
 

Merci XAVIER !!! ca commence à tourner !!!!
 
comment cela se passe pour les termes recherchés (for mot in TATA TOTO TITI TUTU; do ) si un champs en contient deux d'entre eux.
Le script se contentera-t-il de prendre le premier des deux qu'il rencontre pour s'en servir comme préfixe.
En d'autre terme, lorsque la condition est vérifiée, il ne continue pas à vérifier les termes suivants ?
 
(j'ai besoin de cela car dans l'état, il ne gère pas les exclusions : à savoir, prefix=autre, si pas TATA TOTO TITI TUTU.
 
 
Merci encore...

n°994609
tabasko
Posté le 24-12-2007 à 10:59:15  profilanswer
 

j'essaye de placer un "else" mais n'y arrive pas  :heink:  :ouch:  :pfff:

n°994617
tabasko
Posté le 24-12-2007 à 11:21:29  profilanswer
 

j'ai pas l'impression qu'il m'extracte proprement la colonne 4 :(
de même lorsque j'applique  cut -d ' ' -f 4 à mon fichier texte source, je n'obtiens pas un extract de la colonne 4, normal ?
j'ai essayé sans succès de placer dans le script un  awk '{print$4}' qui est la syntaxe que j'ai l'habitude d'utiliser pour extraire une colonne....
 
-edition perso-> je retire le "-d" ce qui remet le séparateur à tabulation à la place de l'espace, cela règle le problème d'lextraction.
me reste donc à gérer l'exclusion ....
 
mon script définit les termes rechercher dans un fichier "TYPE.txt".
Si aucun des termes listés n'est trouvé, j'aimerai faire de PREFIX ; le mot "autre".  
je trouve pas comment placer mon else.


Message édité par tabasko le 24-12-2007 à 11:34:07
n°994703
tabasko
Posté le 24-12-2007 à 14:49:50  profilanswer
 

Citation :

#!/bin/sh
while read line; do
    F4=$(echo "${line}" | cut -f 4)
 
    PREFIX=""
    for mot in `cat TYPE | cut -f 1`
 
    do
 
        if echo "${F4}" | grep -q "${mot}"; then
            PREFIX="${mot}"
        fi
 
    done
    echo "${PREFIX} ${line}"
 
done < monfichier.txt


 
Ceci fonctionne comme désiré, mais reste des exceptions qui font défaut à l'application du script.
J'ai refais mon fichier (motif) TYPE de manière à ce que la première colonne soit la valeur que je recherche, et la seconde, celle dont je souhaite me servir pour le préfixe.
 
En gros ... et cela ne marche pas je voudrai faire :
 

Citation :

#!/bin/sh
while read line; do
    F4=$(echo "${line}" | cut -f 4)
    F3=$(echo "${line}" | cut -f 3)
 
    PREFIX=""
    for mot in `cat TYPE | cut -f 1`
     for pref in `cat TYPE | cut -f 2`
 
    do
 
        if echo "${F4}" | grep -q "${mot}"; then
            PREFIX="${pref}"
        fi
 
 
    done
    echo "${PREFIX} ${line}"
 
done  < monfichier.txt


 
Ceci ne fonctionne pas, et je tourne en rond ... Merci d'avance à ceux qui pourraient m'aider !


Message édité par tabasko le 24-12-2007 à 14:53:21
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  ajouter un mot en début de ligne par rapport à la valeur cherchée

 

Sujets relatifs
[Gentoo] Demarrer l'install en ligne de commandePostfix - Procmail : ajouter le SENDER dans les en-têtes
commande lignecomment tagguer un fichier flac ou wav en ligne de commande
Stream MP3 depuis entrée ligneLogwatch - retirer des services du rapport ?
[cron] Ajouter un script au cron.dailyconvertisseur de bitrate MP3 en ligne de commande ?
Ligne de commande inconnue root@[locahost]:~#mrtg et valeur binaire
Plus de sujets relatifs à : ajouter un mot en début de ligne par rapport à la valeur cherchée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR