2017-01-05 3 views
0

Besoin de créer un awk script pour convertir un glyph (https://en.wikipedia.org/wiki/Glyph) en Unicode (JavaScript syntaxe), et l'inverse - Unicode à un glyphe.En utilisant awk, comment remplacer une chaîne par une autre?

Les données de base sont stockées au NotePad++ avec le codage UTF-8.

Voici mes progrès.

Use_case_1

fichier Dictionnaire (de dict_1_.txt):

A \u0041 
À \u00C0 

fichier d'entrée (input_1_.txt):

A 
À 

écriture awk pour générer Unicode pour équivalent g Lyph:

awk 'NR == FNR { a[$1] = $2; next } $1 in a { $1 = a[$1] } $2 in a { $2 = a[$2] } 1' dict_1_.txt input_1_.txt 

produire correctement:

\u0041 
\u00C0 

Use_case_2

fichier Dictionnaire (de dict_2_.txt)

\u0041 A 
\u00C0 À 

fichier d'entrée (input_2_.txt)

\u0041 
\u00C0 

script awk pour générer des glyphes pour Unicode équivalent:

awk 'NR == FNR { a[$1] = $2; next } $1 in a { $1 = a[$1] } $2 in a { $2 = a[$2] } 1' dict_2.txt input_2.txt 

produire correctement:

A 
À 

Alors, peut avec succès "aller-retour" sur un un seul symbole.

Mais comment gérer un dictionnaire plus complet et plus d'un mot par ligne?

Voici des exemples de données.

fichier d'entrée (de input_3_.txt)

PUDÍN, ALMIDÓN 

fichier Dictionnaire (de dict_3_.txt)

, \u002C 
A \u0041 
D \u0044 
I \u0049 
Í \u00CD 
L \u004C 
M \u004D 
N \u006E 
Ó \u00D3 
P \u0050 
U \u0055 
<space> \u0020 

Le script awk devrait générer:

\u0050\u0055\u0044\u00CD\u006E\u002C\u002C\u0041\u004C\u004D\u0049\u0044\u00D3\u006E 

fichier d'entrée (input_4_.txt)

\u0050\u0055\u0044\u00CD\u006E\u002C\u002C\u0041\u004C\u004D\u0049\u0044\u00D3\u006E 

fichier Dictionnaire (dict_4_.txt)

\u002C , 
\u0041 A 
\u0044 D 
\u0049 I 
\u00CD Í 
\u004C L 
\u004D M 
\u006E N 
\u00D3 Ó 
\u0050 P 
\u0055 U 
\u0020 <space> 

Le script awk devrait générer:

PUDÍN, ALMIDÓN 

Voici un ensemble plus complexe de chaînes d'entrée (un par ligne):

MONO Y DIACETIL ÉSTERES DEL ÁCIDO TARTÁRICO DE MONO Y DIGLICÉRIDOS DE ÁCIDOS GRASOS AÑADIDOS 
043 HUEVAS DE PESCADO (INCLUYENDO ESPERMA=HUEVAS BLANDAS) Y VÍSCERAS COMESTIBLES DE PESCADO 
ACEITE DE SOJA OXIDADO TÉRMICAMENTE Y EN INTERACCIÓN CON MONO Y DIGLICÉRIDOS DE ÁCIDOS GRASOS 
BANDEJA PLÁSTICA O CAZUELA, CUBIERTA DE PAPEL DE ALUMINIO O ENVOLTURA 

Dans les exemples Dictionnaire ci-dessus, ont utilisé <space> pour indiquer la ' symbole 'entre les mots et après une virgule. Cela signifie probablement qu'une solution doit utiliser \t pour FS à la fois dans le fichier Dictionnaire et dans le fichier d'entrée. Actuellement le FS est un 'espace' de clavier. Le RS est également \n.

De plus, je dois faire la même chose pour hexadécimal, donc une solution doit traiter un fichier Dictionnaire comme celui-ci:

Í &#xcd; 
Ó &#xd3; 

par rapport à l'exemple Dictionnaire ci-dessus:

Í \u00CD 
Ó \u00D3 

Comment améliorer ou remplacer mes simples scripts awk avec des scripts qui traitent les chaînes les plus longues sur plusieurs lignes?

+1

wow. cette question est trop longue. Que diriez-vous de le raccourcir? – NinjaGaiden

+0

La question est: 'Comment améliorer ou remplacer mes scripts awk simples avec des scripts qui traitent les chaînes plus longues sur plusieurs lignes? Le texte montre le progrès (MCV) et les données qui, espérons-le, peuvent être traitées par une solution proposée. –

Répondre

1

Voici une approche, notez que vous n'avez pas besoin de deux versions différentes du dictionnaire. Avec un petit effort, ces deux peuvent être combinés en un seul script et la conversion de/à peut être contrôlée avec un paramètre. Je continuais intentionnellement la partie dictionnaire même

$ awk 'NR==FNR {$2=$2?$2:" "; u2a[$1]=$2; a2u[$2]=$1; next} 
       {for(i=1;i<=NF;i++) $i=a2u[$i]}1' dict FS='' OFS='' input 

\u0050\u0055\u0044\u00CD\u006E\u002C\u0020\u0041\u004C\u004D\u0049\u0044\u00D3\u006E 

travaillant avec l'entrée maintenant codée

$ awk 'NR==FNR {$2=$2?$2:" "; u2a[$1]=$2; a2u[$2]=$1; next} 
       {enc=$0; gsub(/....../,"& ",enc); n=split(enc,a); 
       for(i=1;i<=n;i++) line=line u2a[a[i]]; print line}' dict encoded_input 

PUDÍN, ALMIDÓN 

en utilisant votre dict_4 comme le dictionnaire pour les scripts

+0

Vous rencontrez un problème avec 'dict' dans votre texte. Est-ce que ça devrait être 'dict_4_.txt? –

+0

oui, utilisez votre propre nom de fichier. – karakfa

+0

C'est une belle chose. Je peux reproduire votre proposition. Bien sûr, les glyphes espagnols ne s'affichent pas correctement dans mon BASH, mais quand ils sont écrits dans 'output.txt', ils s'ouvrent avec' NotePad ++ '. Donnez-moi une heure pour tester sur les chaînes plus longues. –