#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
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
@+
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 .
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+