2017-01-05 173 views
0

需要创建一个awk脚本以将glyphhttps://en.wikipedia.org/wiki/Glyph)转换为UnicodeJavaScript语法),并将Unicode转换为字形。使用awk,如何用另一个字符串替换一个字符串?

源数据以UTF-8编码存储在NotePad++中。

这是我的进步。

Use_case_1

词典文件(dict_1_.txt):

A \u0041 
À \u00C0 

输入文件(input_1_.txt):

A 
À 

awk脚本用于生成的Unicode等同于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 

正确制造:

\u0041 
\u00C0 

Use_case_2

词典文件(dict_2_.txt)

\u0041 A 
\u00C0 À 

输入文件(input_2_.txt)

\u0041 
\u00C0 

awk脚本用于生成字形为等效的Unicode:

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 

正确制造:

A 
À 

所以,可以在成功地 “往返”单个符号。

但是,如何处理更全面的字典和每行多个字?

以下是样本数据。

输入文件(input_3_.txt)

PUDÍN, ALMIDÓN 

词典文件(dict_3_。TXT)

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

awk脚本应该产生:

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

输入文件(input_4_.txt)

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

字典文件(dict_4_.txt)

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

awk脚本应生成:

PUDÍN, ALMIDÓN 

下面是一个更复杂的设定输入的字符串(每行一个):

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 

在上面的解释实施例中,已经使用<space>指示'符号'之间和逗号后。这可能意味着在Dictionary文件和输入文件中解决方案应该使用\t代替FS。目前FS是键盘“空间”。 RS也是\n

此外,我需要做为十六进制相同的,所以一个解决方案需要处理词典文件是这样的:相比于上述字典示例

Í &#xcd; 
Ó &#xd3; 

Í \u00CD 
Ó \u00D3 

如何改进或替换我的简单awk脚本与处理多行更长的字符串的脚本?

+1

哇。这个问题太长了。如何缩短它? – NinjaGaiden

+0

问题是:'如何用多行处理较长字符串的脚本来改进或替换我简单的awk脚本?'。文本显示了进度(MCV)和希望可以通过建议的解决方案处理的数据。 –

回答

1

这里有一种方法,请注意,你不需要两个不同版本的字典。

只需很少的努力,这两个可以合并为一个脚本,并且可以使用参数控制from/to转换。我特意让字典部分相同

$ 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 

现在

$ 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 

与编码的输入工作使用dict_4作为字典两个脚本

+0

在文字中出现“字典”的问题。那应该是'dict_4_.txt? –

+0

是的,使用你自己的文件名。 – karakfa

+0

这是一件美丽的事情。我可以复制你的建议。当然,西班牙字形在我的BASH中不能正确渲染,但是在写入'output.txt'并用'NotePad ++'打开时可以。给我一个小时来测试更长的琴弦。 –

相关问题