使用awk,如何用另一个字符串替换一个字符串?

使用awk,如何用另一个字符串替换一个字符串?,awk,gawk,Awk,Gawk,需要创建一个awk脚本来将glyph转换为Unicode JavaScript语法,并将反向Unicode转换为glyph 源数据以UTF-8编码存储在NotePad++中 这是我的进步 用例1 字典文件dict_1_.txt: A \u0041 À \u00C0 输入文件Input_1_.txt: A À 用于为等效图示符生成Unicode的awk脚本: awk 'NR == FNR { a[$1] = $2; next } $1 in a { $1 = a[$1] } $2 in a {

需要创建一个awk脚本来将glyph转换为Unicode JavaScript语法,并将反向Unicode转换为glyph

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

这是我的进步

用例1

字典文件dict_1_.txt:

A \u0041
À \u00C0
输入文件Input_1_.txt:

A
À
用于为等效图示符生成Unicode的awk脚本:

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
A
À
用例2

字典文件dict_2_.txt

\u0041 A
\u00C0 À
输入文件Input_2_.txt

\u0041
\u00C0
用于生成等效Unicode符号的awk脚本:

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
正确生产:

\u0041
\u00C0
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
输入文件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>
下面是一组更复杂的输入字符串,每行一个:

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
在上面的词典示例中,用于表示单词之间和逗号后的“符号”。这可能意味着解决方案应该在字典文件和输入文件中对FS使用\t。目前FS是一个键盘“空间”。而且RS是\n

此外,我还需要对十六进制进行同样的处理,因此解决方案需要处理如下字典文件:

Í   &#xcd;
Ó   &#xd3;
与上面的字典示例相比:

Í   \u00CD
Ó   \u00D3

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

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

不费吹灰之力,就可以将这两个脚本组合成一个脚本,并且可以通过参数控制从/到转换。我故意保持字典的部分不变

$ 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作为两个脚本的字典

wow。这个问题太长了。如何缩短它?问题是:如何改进或替换我的简单awk脚本,使用在多行上处理较长字符串的脚本?。文本显示了MCV的进度和数据,希望可以通过建议的解决方案进行处理。文本中的“dict”有问题。这应该是‘dict_4_.txt’吗?这是一件美好的事情。我可以复制你的建议。当然,西班牙语glyph在我的BASH中不会正确呈现,但在写入output.txt并使用NotePad++打开时会正确呈现。“给我一个小时来测试更长的弦。”杰伊·格雷。对不起,就这样吧。好吧,让我想想怎么做最好。可以删减最初的问题,替换您的提案,并添加失败的数据。还可以提交一个新问题,包括迄今为止的进展情况。你有偏好吗?