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.

#26 Le 20/09/2007, à 00:06

hector

Re : script bash pour bidouiller un fichier texte

bravo à best_friend pour son superbe script:
mais je cherche la petite bête tongue
la présence d'un caractère % dans la liste me fait planter le script (ligne awk avec print qui doit utiliser la fonction C printf, pour laquelle le caractère % a une signification particulière)

awk -F"\t" '{split($2,tab,", ");for (i in tab) print tab[i]"\t"$1}'

si il y a un moyen facile d'éviter le problème, je suis preneur (sinon, c'est pas bien grave ...)
Merci

Hors ligne

#27 Le 20/09/2007, à 01:03

Sorbus

Re : script bash pour bidouiller un fichier texte

Exact... J'ai eu aussi ce petit problème...
... que j'ai résolu par un bricolage sans toucher au script :

J'ai fait un remplacement automatique dans le fichier source de "%" par "XXXXX"

Puis j'ai utilisé le script sur le fichier source (débarrassé des "%")

Puis j'ai ouvert le fichier destination sur lequel j'ai fait un remplacement automatique de "XXXXX" par "%"...

Mais c'est du bricolage... pour pouvoir utiliser le script en attendant la réponse de best_friend wink

@+

Hors ligne

#28 Le 20/09/2007, à 02:30

best_friend_fr

Re : script bash pour bidouiller un fichier texte

Je ne connais pas bien le printf de awk, mais en C, dans un cas comme ca, si tu as
une chaine s qui contient un %, tu remplaces printf(s) par printf("%s",s);

essaye pour voir.


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#29 Le 20/09/2007, à 02:40

best_friend_fr

Re : script bash pour bidouiller un fichier texte

#!/bin/bash

cat $1 | awk -F"\t" '{split($2,tab,", ");for (i in tab) print tab[i]"\t"$1}' |
sort -t \n |
awk -F"\t" '{if ($1 != key) {if (paspremier == "oui") printf "\n"; printf "%s", $1"\t"$2;} else {printf ", %s", $2;} key = $1; paspremier="oui";} END {printf("\n");}' > $2

Je vous laisse appliquer les patchs de tri

Dernière modification par best_friend_fr (Le 20/09/2007, à 02:42)


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#30 Le 20/09/2007, à 06:43

Sorbus

Re : script bash pour bidouiller un fichier texte

J'ajoute une bricole pour que les rapprcochements entre mots identiques dans le champ 1 se fassent complètement :

LC_ALL=C devant "sort"

#!/bin/bash

cat $1 | awk -F"\t" '{split($2,tab,", ");for (i in tab) print tab[i]"\t"$1}' |
LC_ALL=C sort -t \n |
awk -F"\t" '{if ($1 != key) {if (paspremier == "oui") printf "\n"; printf "%s", $1"\t"$2;} else {printf ", %s", $2;} key = $1; paspremier="oui";} END {printf("\n");}' > $2

Je me demande d'ailleurs si "-t \n" sert à quelque chose pour notre problème.
Il me semble que "LC_ALL=C sort" suffit.

Hors ligne

#31 Le 23/08/2008, à 11:16

Sorbus

Re : script bash pour bidouiller un fichier texte

Je reprends cette discussion, car ma question est du même ordre,

Pour certains fichiers dictionnaires, j'obtiens quelque chose de ce type :

abandon                        abbandonu
aboyer                          abbachjà
demeurer bouche bée      abbachjà
aboyer                          abbaghjà
avoir le regard troublé      abbalanà
avoir le vertige               abbaglianà
                                   abbambacinà
                                   abbacinà
                                   abbambanà
                                   abbacinà
faire tourner la tête         abbacinà
ébloulir                          abbacinà
demeurer bouche bée      abbacchià

La structure est :
mot 1[tabulation]mot 2

1°) lorsque le champ "mot 1" est vide, il faudrait pouvoir le remplacer par le champ "mot 1" de la ligne supérieure la plus proche où ce champ n'est pas vide. Dans l'exemple ci-dessus, il faudrait que "avoir le vertige" soit reproduit dans le champ 1 des 4 lignes qui suivent.

2°) ensuite, il faudrait comparer les lignes deux à deux, et supprimer les doublons : lorsque deux lignes sont strictement identiques, n'en garder qu'une. Ce serait le cas ici de
avoir le vertige               abbacinà
qui est répété deux fois.

Dans mes fichiers, ces lignes ne se suivent pas toujours immédiatement (n... n+1)... mais elles sont toujours relativement proches (au maximum 5-6 lignes d'écart.

Quelqu'un aurait-il une idée pour résoudre ça ?

Dernière modification par Sorbus (Le 23/08/2008, à 11:16)

Hors ligne

#32 Le 26/08/2008, à 07:30

Sorbus

Re : script bash pour bidouiller un fichier texte

J'ai trouvé la solution en procédant autrement... Les lignes à premier champ vide sont ramenées sur la ligne supérieure, avec sed... saut de ligne + tabulation étant remplacées par un point virgule + deux tabulations... Puis je joue sur les champs avec awk {print $...} pour répéter le champ 1 au bons endroits...

Le point virgule est ensuite remplacé via sed par un saut de ligne...

Les lignes sont classées et les doublons supprimés par sort 'LC_ALL=C sort -u -f -t \n'

La question est donc réglée  smile.

Hors ligne

#33 Le 26/08/2008, à 09:54

Didier de Toulouse

Re : script bash pour bidouiller un fichier texte

Sinon, il y avait P E R L, en 4 lettres : Practical Extraction and Report Language.

ça parait tout indiqué pour ton problème.

A+