使用 awk,如何将一个字符串替换为另一个字符串?
Using awk, how to replace one string with another?
需要创建一个 awk
脚本来将 glyph
(https://en.wikipedia.org/wiki/Glyph) 转换为 Unicode
(JavaScript
语法),以及相反的 - Unicode到字形。
源数据以 UTF-8
编码存储在 NotePad++
中。
这是我的进度。
Use_case_1
词典文件 (dict_1_.txt):
A \u0041
À \u00C0
输入文件 (input_1_.txt):
A
À
awk
为等效字形生成 Unicode 的脚本:
awk 'NR == FNR { a[] = ; next } in a { = a[] } in a { = a[] } 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[] = ; next } in a { = a[] } in a { = a[] } 1' dict_2.txt input_2.txt
正确生成:
A
À
所以,可以在单个交易品种上成功"round-trip"。
但是字典比较全面,每行多一个词怎么处理?
这是示例数据。
输入文件 (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>
表示单词之间和逗号之后的 'symbol'。这可能意味着解决方案应该在字典文件和输入文件中对 FS
使用 \t
。当前 FS
是键盘 'space'。另外 RS
是 \n
.
此外,我需要对十六进制执行相同的操作,因此解决方案需要像这样处理字典文件:
Í Í
Ó Ó
与上面的字典示例相比:
Í \u00CD
Ó \u00D3
如何改进我的简单 awk
脚本或将其替换为处理多行较长字符串的脚本?
这是一种方法,请注意您不需要两个不同版本的词典。
不费吹灰之力就可以将这两个脚本合并到一个脚本中,并且 from/to 转换可以通过一个参数来控制。我故意让字典部分保持不变
$ awk 'NR==FNR {=?:" "; u2a[]=; a2u[]=; 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 {=?:" "; u2a[]=; a2u[]=; next}
{enc=[=11=]; 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 作为两个脚本的字典
需要创建一个 awk
脚本来将 glyph
(https://en.wikipedia.org/wiki/Glyph) 转换为 Unicode
(JavaScript
语法),以及相反的 - Unicode到字形。
源数据以 UTF-8
编码存储在 NotePad++
中。
这是我的进度。
Use_case_1
词典文件 (dict_1_.txt):
A \u0041
À \u00C0
输入文件 (input_1_.txt):
A
À
awk
为等效字形生成 Unicode 的脚本:
awk 'NR == FNR { a[] = ; next } in a { = a[] } in a { = a[] } 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[] = ; next } in a { = a[] } in a { = a[] } 1' dict_2.txt input_2.txt
正确生成:
A
À
所以,可以在单个交易品种上成功"round-trip"。
但是字典比较全面,每行多一个词怎么处理?
这是示例数据。
输入文件 (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>
表示单词之间和逗号之后的 'symbol'。这可能意味着解决方案应该在字典文件和输入文件中对 FS
使用 \t
。当前 FS
是键盘 'space'。另外 RS
是 \n
.
此外,我需要对十六进制执行相同的操作,因此解决方案需要像这样处理字典文件:
Í Í
Ó Ó
与上面的字典示例相比:
Í \u00CD
Ó \u00D3
如何改进我的简单 awk
脚本或将其替换为处理多行较长字符串的脚本?
这是一种方法,请注意您不需要两个不同版本的词典。
不费吹灰之力就可以将这两个脚本合并到一个脚本中,并且 from/to 转换可以通过一个参数来控制。我故意让字典部分保持不变
$ awk 'NR==FNR {=?:" "; u2a[]=; a2u[]=; 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 {=?:" "; u2a[]=; a2u[]=; next}
{enc=[=11=]; 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 作为两个脚本的字典