Bonsoir,
Je suis en train de mettre en forme un dictionnaire destiné à être utilisé avec stardict. J’ai déjà un fichier tabulé (fichier texte avec extension tab) dans le sens langue1–>langue2, composé d’un certain nombre de lignes sous la forme :
mot (ou expression) --tabulation–> traduction
Dans la deuxième partie de la ligne (zone traduction), il y a parfois plusieurs mots ou expressions, séparés pas une virgule… un mot dans une langue pouvant avoir plusieurs équivalents dans une autre.
Je voudrais réaliser un script bash permettant d’inverser intelligemment les deux colonnes. L’objectif est de pouvoir automatiquement créer l’autre sens du dictionnaire (langue2 --> langue 1)… sans avoir à tout reprendre manuellement… et de pouvoir renouveler cette création automatique de “langue2 --> langue1” chaque fois que je fais des corrections ou compléments sur “langue 1 --> langue 2.”
Il ne s’agit pas d’une simple inversion (ce serait trop facile )
Pour m’expliquer, je préfère donner un exemple.
N.B. : dans les exemples ci-dessous, j’ai visualisé une tabulation par “–>”
Dans le sens langue 1 --> langue 2, j’ai ça :
[quote]
viotu–> vide, creux
viotoru --> creux
virdura --> verdure
virticale --> vertical
visa --> viser
visà --> visa (de la police, du consulat)
visatu --> visa (de la police, du consulat)
visionà --> visionner
visita --> visite, inspection
visità --> visiter, inspecter, explorer
visiunà --> visionner [/quote]
Je voudrais obtenir à la fin ceci :
[quote]creux --> viotoru, viotu
explorer --> visità
inspecter --> visità
inspection --> visita
verdure --> virdura
vertical --> virticale
vide --> viotu
visa (de la police, du consulat) --> visà, visatu
viser --> visa
visionner --> visionà, visiunà
visite --> visita
visiter --> visità[/quote]
C’est à dire que dans la première colonne, il ne doit y avoir qu’un mot (ou expression) par ligne… et dans la seconde colonne, les diverses traductions de ce mot dans l’autre langue, séparées par une virgule.
Pour l’instant, en cherchant sur la toile, je suis arrivé à inverser les colonnes, et à reclasser par ordre alphabétique la première colonne, puis à séparer en plusieurs lignes lorsqu’il y a plusieurs mots séparés par une virgule dans la 1er champ…
Le script utilisé est le suivant :
[code]#!/bin/bash
TEMP=mktemp
$2
cat $1 | sed -e ‘s/(.)\t(.)/\2\t\1/’ > $TEMP
sort -t \n $TEMP > $2
rm $TEMP
cat $2 | sed ‘s/, /\t*\n/g’ > $TEMP
mv $TEMP $2[/code]
Et j’aboutis à ceci :
[quote]creux --> viotoru
verdure --> virdura
vertical --> virticale
vide --> *
creux --> viotu
visa (de la police ou du consulat) --> visà
visa (de la police ou du consulat) --> visatu
viser --> visa
visionner --> visionà
visionner --> visiunà
visite --> *
inspection --> visita
visiter --> *
inspecter --> *
explorer --> visità[/quote]
Lorsque le script place une astérisque dans le champ 2 (2ème colonne), c’est qu’il faut ensuite pouvoir remplacer l’astérisque par le mot (ou l’expression) du champ 2 de la ligne suivante.
Et c’est la que je bloque… Comment faire pour que, chaque fois qu’il y a une astérisque dans le champ 2 d’une ligne, le script fasse un “copier” de ce qui est dans le champ 2 de la ligne suivante et vienne le coller à la place de l’astérisque ? C’est à dire pour obtenir ceci dans l’exemple des lignes visite/inspection :
[quote]visite --> visita
inspection --> visita[/quote]
au lieu de
[quote]visite --> *
inspection --> visita[/quote]
Une fois ceci fait, un “sort -t \n” remettrait le tout par ordre alphabétique (pour la langue2, placée dans la 1ère colonne), et on approcherais du but.
Il resterait encore à réduire en une seule ligne les lignes successives dont le 1er champ est identique, comme par exemple :
[quote]visionner --> visionà
visionner --> visiunà [/quote]
… à transformer en
(et je bloque aussi sur cette dernière opération.)
Je suis un apprenti en bash… et ma connaissance des outils et options possibles est limitée… Il y a peut-être plus simple pour obtenir ce que je souhaite.
Voilà… Mais si on arrive à mettre au point ce script, ça rendra service pour les compléments et mises à jour de plein de dictionnaires disponibles pour stardict… gratuits, et libres…